diff options
author | arjan <arjan@arjan-desktop.localdomain> | 2010-09-18 04:47:34 -0700 |
---|---|---|
committer | arjan <arjan@arjan-desktop.localdomain> | 2010-09-18 04:47:34 -0700 |
commit | 9b8da64b2694f9c6e11ebe338d6b436e4eb8962b (patch) | |
tree | 56b186a02a87ae251f7c174fe7182d28954ad7d7 | |
parent | e8eef1e946a4a361a1e017f724934d2e00eea801 (diff) | |
download | powertop-9b8da64b2694f9c6e11ebe338d6b436e4eb8962b.tar.gz |
use indexes for the results as well.... major speedup
-rw-r--r-- | cpu/cpudevice.cpp | 12 | ||||
-rw-r--r-- | cpu/cpudevice.h | 4 | ||||
-rw-r--r-- | devices/ahci.cpp | 21 | ||||
-rw-r--r-- | devices/ahci.h | 2 | ||||
-rw-r--r-- | devices/alsa.cpp | 3 | ||||
-rw-r--r-- | devices/alsa.h | 1 | ||||
-rw-r--r-- | devices/backlight.cpp | 14 | ||||
-rw-r--r-- | devices/backlight.h | 2 | ||||
-rw-r--r-- | devices/i915-gpu.cpp | 5 | ||||
-rw-r--r-- | devices/rfkill.cpp | 6 | ||||
-rw-r--r-- | devices/rfkill.h | 2 | ||||
-rw-r--r-- | devices/thinkpad-fan.cpp | 5 | ||||
-rw-r--r-- | devices/usb.cpp | 21 | ||||
-rw-r--r-- | devices/usb.h | 3 | ||||
-rw-r--r-- | parameters/parameters.cpp | 46 | ||||
-rw-r--r-- | parameters/parameters.h | 7 | ||||
-rw-r--r-- | parameters/persistent.cpp | 8 |
17 files changed, 126 insertions, 36 deletions
diff --git a/cpu/cpudevice.cpp b/cpu/cpudevice.cpp index 03e35d2..86ed87d 100644 --- a/cpu/cpudevice.cpp +++ b/cpu/cpudevice.cpp @@ -10,6 +10,10 @@ cpudevice::cpudevice(const char *classname, const char *device_name, class abstr strcpy(_class, classname); strcpy(_cpuname, device_name); cpu = _cpu; + wake_index = get_param_index("cpu-wakeups");; + consumption_index = get_param_index("cpu-consumption");; + r_wake_index = get_result_index("cpu-wakeups");; + r_consumption_index = get_result_index("cpu-consumption");; } @@ -22,13 +26,13 @@ double cpudevice::power_usage(struct result_bundle *result, struct parameter_bun double utilization; power = 0; - factor = get_parameter_value("cpu-wakeups", bundle); - utilization = get_result_value("cpu-wakeups", result); + factor = get_parameter_value(wake_index, bundle); + utilization = get_result_value(r_wake_index, result); power += utilization * factor / 1000.0; - factor = get_parameter_value("cpu-consumption", bundle); - utilization = get_result_value("cpu-consumption", result); + factor = get_parameter_value(consumption_index, bundle); + utilization = get_result_value(r_consumption_index, result); power += utilization * factor / 100.0; diff --git a/cpu/cpudevice.h b/cpu/cpudevice.h index 2dcec41..5fe2bc8 100644 --- a/cpu/cpudevice.h +++ b/cpu/cpudevice.h @@ -15,6 +15,10 @@ class cpudevice: public device { vector<string> params; class abstract_cpu *cpu; + int wake_index; + int consumption_index; + int r_wake_index; + int r_consumption_index; public: cpudevice(const char *classname = "cpu", const char *device_name = "cpu0", class abstract_cpu *_cpu = NULL); diff --git a/devices/ahci.cpp b/devices/ahci.cpp index 5716235..dc65795 100644 --- a/devices/ahci.cpp +++ b/devices/ahci.cpp @@ -169,19 +169,30 @@ double ahci::power_usage(struct result_bundle *result, struct parameter_bundle * active_index = get_param_index("ahci-link-power-active"); if (!partial_index) - active_index = get_param_index("ahci-link-power-partial"); + partial_index = get_param_index("ahci-link-power-partial"); + power = 0; factor = get_parameter_value(active_index, bundle); - sprintf(buffer, "%s-active", name); - utilization = get_result_value(buffer, result); + if (!active_rindex) { + sprintf(buffer, "%s-active", name); + active_rindex = get_result_index(buffer); + } + + + utilization = get_result_value(active_rindex, result); power += utilization * factor / 100.0; - sprintf(buffer, "%s-partial", name); + + if (!partial_rindex) { + sprintf(buffer, "%s-partial", name); + partial_rindex = get_result_index(buffer); + } + factor = get_parameter_value(partial_index, bundle); - utilization = get_result_value(buffer, result); + utilization = get_result_value(partial_rindex, result); power += utilization * factor / 100.0; diff --git a/devices/ahci.h b/devices/ahci.h index 839b56e..27d0a29 100644 --- a/devices/ahci.h +++ b/devices/ahci.h @@ -11,6 +11,8 @@ class ahci: public device { uint64_t start_slumber, end_slumber; char sysfs_path[4096]; char name[4096]; + int partial_rindex; + int active_rindex; public: ahci(char *_name, char *path); diff --git a/devices/alsa.cpp b/devices/alsa.cpp index 175a6e5..378e13c 100644 --- a/devices/alsa.cpp +++ b/devices/alsa.cpp @@ -25,6 +25,7 @@ alsa::alsa(char *_name, char *path) strncpy(sysfs_path, path, sizeof(sysfs_path)); sprintf(devname, "alsa:%s", _name); strncpy(name, devname, sizeof(name)); + rindex = get_result_index(name); } void alsa::start_measurement(void) @@ -141,7 +142,7 @@ double alsa::power_usage(struct result_bundle *result, struct parameter_bundle * index = get_param_index("alsa-codec-power"); factor = get_parameter_value(index, bundle); - utilization = get_result_value(name, result); + utilization = get_result_value(rindex, result); power += utilization * factor / 100.0; diff --git a/devices/alsa.h b/devices/alsa.h index e3f2f37..5a6e28c 100644 --- a/devices/alsa.h +++ b/devices/alsa.h @@ -10,6 +10,7 @@ class alsa: public device { uint64_t start_inactive, end_inactive; char sysfs_path[4096]; char name[4096]; + int rindex; public: alsa(char *_name, char *path); diff --git a/devices/backlight.cpp b/devices/backlight.cpp index c547e18..270b774 100644 --- a/devices/backlight.cpp +++ b/devices/backlight.cpp @@ -24,6 +24,8 @@ backlight::backlight(char *_name, char *path) strncpy(sysfs_path, path, sizeof(sysfs_path)); sprintf(devname, "backlight:%s", _name); strncpy(name, devname, sizeof(name)); + r_index = get_result_index(name); + r_index_power = 0; } void backlight::start_measurement(void) @@ -165,17 +167,21 @@ double backlight::power_usage(struct result_bundle *result, struct parameter_bun if (!bl_index) bl_index = get_param_index("backlight"); if (!blp_index) - bl_index = get_param_index("backlight-power"); + blp_index = get_param_index("backlight-power"); power = 0; factor = get_parameter_value(bl_index, bundle); - utilization = get_result_value(name, result); + utilization = get_result_value(r_index, result); power += utilization * factor / 100.0; factor = get_parameter_value(blp_index, bundle); - sprintf(powername, "%s-power", name); - utilization = get_result_value(powername, result); + + if (!r_index_power) { + sprintf(powername, "%s-power", name); + r_index_power = get_result_index(powername); + } + utilization = get_result_value(r_index_power, result); power += utilization * factor / 100.0; diff --git a/devices/backlight.h b/devices/backlight.h index a178dbb..a44bed3 100644 --- a/devices/backlight.h +++ b/devices/backlight.h @@ -9,6 +9,8 @@ class backlight: public device { int start_level, end_level; char sysfs_path[4096]; char name[4096]; + int r_index; + int r_index_power; public: backlight(char *_name, char *path); diff --git a/devices/i915-gpu.cpp b/devices/i915-gpu.cpp index f1c5ed0..0681cb9 100644 --- a/devices/i915-gpu.cpp +++ b/devices/i915-gpu.cpp @@ -58,13 +58,16 @@ double i915gpu::power_usage(struct result_bundle *result, struct parameter_bundl double factor; double utilization; static int index = 0; + static int rindex = 0; if (!index) index = get_param_index("gpu-operations"); + if (!rindex) + rindex = get_result_index("gpu-operations"); power = 0; factor = get_parameter_value(index, bundle); - utilization = get_result_value("gpu-operations", result); + utilization = get_result_value(rindex, result); power += utilization * factor / 100.0; return power; diff --git a/devices/rfkill.cpp b/devices/rfkill.cpp index e585e91..9ecc331 100644 --- a/devices/rfkill.cpp +++ b/devices/rfkill.cpp @@ -26,6 +26,8 @@ rfkill::rfkill(char *_name, char *path) sprintf(devname, "radio:%s", _name); strncpy(name, devname, sizeof(name)); register_parameter(devname); + index = get_param_index(devname); + rindex = get_result_index(name); } void rfkill::start_measurement(void) @@ -137,8 +139,8 @@ double rfkill::power_usage(struct result_bundle *result, struct parameter_bundle double utilization; power = 0; - factor = get_parameter_value(name, bundle); - utilization = get_result_value(name, result); + factor = get_parameter_value(index, bundle); + utilization = get_result_value(rindex, result); power += utilization * factor / 100.0; diff --git a/devices/rfkill.h b/devices/rfkill.h index b85bf59..05acae2 100644 --- a/devices/rfkill.h +++ b/devices/rfkill.h @@ -9,6 +9,8 @@ class rfkill: public device { int start_hard, end_hard; char sysfs_path[4096]; char name[4096]; + int index; + int rindex; public: rfkill(char *_name, char *path); diff --git a/devices/thinkpad-fan.cpp b/devices/thinkpad-fan.cpp index c60dbab..2ced2a9 100644 --- a/devices/thinkpad-fan.cpp +++ b/devices/thinkpad-fan.cpp @@ -67,14 +67,17 @@ double thinkpad_fan::power_usage(struct result_bundle *result, struct parameter_ double utilization; static int fan_index = 0, fansqr_index = 0; + static int r_index = 0; if (!fan_index) fan_index = get_param_index("thinkpad-fan"); if (!fansqr_index) fansqr_index = get_param_index("thinkpad-fan-sqr"); + if (!r_index) + r_index = get_result_index("thinkpad-fan"); power = 0; - utilization = get_result_value("thinkpad-fan", result); + utilization = get_result_value(r_index, result); utilization = utilization - 50; if (utilization < 0) diff --git a/devices/usb.cpp b/devices/usb.cpp index f187a98..cbaee74 100644 --- a/devices/usb.cpp +++ b/devices/usb.cpp @@ -21,6 +21,15 @@ usbdevice::usbdevice(const char *_name, const char *path, const char *devid) active_after = 0; connected_before = 0; connected_after = 0; + index = 0; + r_index = get_result_index(name); + rootport = 0; + /* root ports should count as 0 .. their activity is derived */ + if (strcmp(devname, "usb-device-1d6b-0001") == 0) + rootport = 1; + if (strcmp(devname, "usb-device-1d6b-0002") == 0) + rootport = 1; + } @@ -93,15 +102,15 @@ double usbdevice::power_usage(struct result_bundle *result, struct parameter_bun double factor; double utilization; - /* root ports should count as 0 .. their activity is derived */ - if (strcmp(devname, "usb-device-1d6b-0001") == 0) - return 0.0; - if (strcmp(devname, "usb-device-1d6b-0002") == 0) + if (rootport) return 0.0; + if (index == 0) + index = get_param_index(devname); + power = 0; - factor = get_parameter_value(devname, bundle); - utilization = get_result_value(name, result); + factor = get_parameter_value(index, bundle); + utilization = get_result_value(r_index, result); power += utilization * factor / 100.0; diff --git a/devices/usb.h b/devices/usb.h index 65d4b74..1f4b542 100644 --- a/devices/usb.h +++ b/devices/usb.h @@ -10,6 +10,9 @@ class usbdevice: public device { char sysfs_path[4096]; char name[4096]; char devname[4096]; + int index; + int r_index; + int rootport; public: usbdevice(const char *_name, const char *path, const char *devid); diff --git a/parameters/parameters.cpp b/parameters/parameters.cpp index 068ebaa..d0334e4 100644 --- a/parameters/parameters.cpp +++ b/parameters/parameters.cpp @@ -12,6 +12,8 @@ vector <struct result_bundle *> past_results; map <string, int> param_index; static int maxindex = 1; +map <string, int> result_index; +static int maxresindex = 1; int get_param_index(const char *name) { @@ -26,6 +28,17 @@ int get_param_index(const char *name) return index; } +int get_result_index(const char *name) +{ + int index; + index = result_index[name]; + if (index == 0) { + index = result_index[name] = ++maxresindex; + } + + return index; +} + void register_parameter(const char *name, double default_value) { @@ -68,7 +81,22 @@ double get_parameter_value(int index, struct parameter_bundle *the_bundle) double get_result_value(const char *name, struct result_bundle *the_bundle) { - return the_bundle->utilization[name]; + return get_result_value(get_result_index(name), the_bundle); +} + +void set_result_value(const char *name, double value, struct result_bundle *the_bundle) +{ + unsigned int index = get_result_index(name); + if (index >= the_bundle->utilization.size()) + the_bundle->utilization.resize(index+1); + the_bundle->utilization[index] = value; +} + +double get_result_value(int index, struct result_bundle *the_bundle) +{ + if (index >= (int) the_bundle->utilization.size()) + return 0; + return the_bundle->utilization[index]; } @@ -84,7 +112,7 @@ int result_device_exists(const char *name) void report_utilization(const char *name, double value, struct result_bundle *bundle) { - bundle->utilization[name] = value; + set_result_value(name, value, bundle); } @@ -159,14 +187,16 @@ void dump_parameter_bundle(struct parameter_bundle *para) void dump_result_bundle(struct result_bundle *res) { - map<string, double>::iterator it; + map<string, int>::iterator it; + unsigned int index; printf("\n\n"); printf("Utilisation state \n"); printf("----------------------------------\n"); printf("Value\t\tName\n"); - for (it = res->utilization.begin(); it != res->utilization.end(); it++) { - printf("%5.2f%%\t\t%s\n", it->second, it->first.c_str()); + for (it = result_index.begin(); it != result_index.end(); it++) { + index = get_result_index(it->first.c_str()); + printf("%5.2f%%\t\t%s(%i)\n", res->utilization[index], it->first.c_str(), index); } printf("\n"); @@ -179,6 +209,7 @@ struct result_bundle * clone_results(struct result_bundle *bundle) { struct result_bundle *b2; map<string, double>::iterator it; + unsigned int i; b2 = new struct result_bundle; @@ -186,9 +217,10 @@ struct result_bundle * clone_results(struct result_bundle *bundle) return NULL; b2->power = bundle->power; + b2->utilization.resize(bundle->utilization.size()); - for (it = bundle->utilization.begin(); it != bundle->utilization.end(); it++) { - b2->utilization[it->first] = it->second; + for (i = 0; i < bundle->utilization.size(); i++) { + b2->utilization[i] = bundle->utilization[i]; } return b2; diff --git a/parameters/parameters.h b/parameters/parameters.h index 94b795a..b30646c 100644 --- a/parameters/parameters.h +++ b/parameters/parameters.h @@ -25,8 +25,10 @@ struct parameter_bundle extern struct parameter_bundle all_parameters; extern map <string, int> param_index; +extern map <string, int> result_index; extern int get_param_index(const char *param); +extern int get_result_index(const char *param); extern void register_parameter(const char *name, double default_value = 0.00); @@ -38,13 +40,16 @@ extern void set_parameter_value(const char *name, double value, struct parameter struct result_bundle { double power; - map <string, double> utilization; /* device name, device utilization %age */ + vector <double> utilization; /* device name, device utilization %age */ }; extern struct result_bundle all_results; extern vector <struct result_bundle *> past_results; extern double get_result_value(const char *name, struct result_bundle *bundle = &all_results); +extern double get_result_value(int index, struct result_bundle *bundle = &all_results); + +extern void set_result_value(const char *name, double value, struct result_bundle *bundle = &all_results); extern int result_device_exists(const char *name); diff --git a/parameters/persistent.cpp b/parameters/persistent.cpp index 2653ffc..b1d3355 100644 --- a/parameters/persistent.cpp +++ b/parameters/persistent.cpp @@ -20,11 +20,11 @@ void save_all_results(const char *filename) } for (i = 0; i < past_results.size(); i++) { bundle = past_results[i]; - map<string, double>::iterator it; + map<string, int>::iterator it; file << setiosflags(ios::fixed) << setprecision(5) << bundle->power << "\n"; - for (it = bundle->utilization.begin(); it != bundle->utilization.end(); it++) { - file << it->first << "\t" << setprecision(5) << it->second << "\n"; + for (it = result_index.begin(); it != result_index.end(); it++) { + file << it->first << "\t" << setprecision(5) << get_result_value(it->second, bundle) << "\n"; } file << ":\n"; } @@ -76,7 +76,7 @@ void load_results(const char *filename) *c1 = 0; c1++; sscanf(c1, "%lf", &d); - bundle->utilization[line] =d; + set_result_value(line, d, bundle); } file.close(); |