aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarjan <arjan@arjan-desktop.localdomain>2010-09-18 04:47:34 -0700
committerarjan <arjan@arjan-desktop.localdomain>2010-09-18 04:47:34 -0700
commit9b8da64b2694f9c6e11ebe338d6b436e4eb8962b (patch)
tree56b186a02a87ae251f7c174fe7182d28954ad7d7
parente8eef1e946a4a361a1e017f724934d2e00eea801 (diff)
downloadpowertop-9b8da64b2694f9c6e11ebe338d6b436e4eb8962b.tar.gz
use indexes for the results as well.... major speedup
-rw-r--r--cpu/cpudevice.cpp12
-rw-r--r--cpu/cpudevice.h4
-rw-r--r--devices/ahci.cpp21
-rw-r--r--devices/ahci.h2
-rw-r--r--devices/alsa.cpp3
-rw-r--r--devices/alsa.h1
-rw-r--r--devices/backlight.cpp14
-rw-r--r--devices/backlight.h2
-rw-r--r--devices/i915-gpu.cpp5
-rw-r--r--devices/rfkill.cpp6
-rw-r--r--devices/rfkill.h2
-rw-r--r--devices/thinkpad-fan.cpp5
-rw-r--r--devices/usb.cpp21
-rw-r--r--devices/usb.h3
-rw-r--r--parameters/parameters.cpp46
-rw-r--r--parameters/parameters.h7
-rw-r--r--parameters/persistent.cpp8
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();