| from collections import OrderedDict |
| from urlresults import URLResults |
| from math import log, exp |
| |
| |
| class PLTResults(object): |
| |
| def __init__(self, geo_sum=1, totalsum=0, num_urls=0, urls=None): |
| self.geo_sum = geo_sum |
| self.sum = totalsum |
| self.count = num_urls |
| if urls is None: |
| urls = OrderedDict() |
| self.urls = urls |
| |
| def __add__(self, other): |
| new_geo_sum = self.geo_sum + other.geo_sum |
| new_sum = self.sum + other.sum |
| new_count = self.count + other.count |
| new_urls = OrderedDict(self.urls) |
| for (url, results) in other.urls.items(): |
| if url not in self.urls: |
| new_urls[url] = URLResults() |
| new_urls[url] += results |
| return PLTResults(new_geo_sum, new_sum, new_count, new_urls) |
| |
| def add_timing_result(self, time, url): |
| self.geo_sum += log(time) |
| self.sum += time |
| self.count += 1 |
| if url in self.urls: |
| self.urls[url] += URLResults(time, 1, time ** 2) |
| else: |
| self.urls[url] = URLResults(time, 1, time ** 2) |
| |
| @property |
| def mean(self): |
| if self.count: |
| return self.sum / float(self.count) |
| else: |
| return 0 |
| |
| @property |
| def geometric_mean(self): |
| if self.count: |
| return exp(self.geo_sum / float(self.count)) |
| else: |
| return 0 |
| |
| @property |
| def mean_coef_variance(self): |
| total = 0.0 |
| for _, results in self.urls.items(): |
| total += results.coef_variance |
| if self.urls and len(self.urls): |
| return total / float(len(self.urls)) |
| else: |
| return 0.0 |
| |
| def print_results(self, suitename=None, cold_run=False): |
| print("------------------------------") |
| if not suitename: |
| print("") |
| print("------------------------------") |
| print("OVERALL PLT RESULTS SUMMARY:") |
| elif cold_run: |
| print("Cold Run Results for {name}:".format(name=suitename)) |
| else: |
| print("PLT Results for {name}:".format(name=suitename)) |
| if suitename: |
| self.print_url_results("MEAN") |
| else: |
| self.print_url_results("TOTAL MEAN") |
| print("------------------------------") |
| print("TOTAL TIME: {time}".format(time=self._format_time(self.sum))) |
| print("TOTAL URLS: {urls}".format(urls=self.count)) |
| if self.urls and len(self.urls) and self.urls.values()[0].count > 1: |
| print("AVERAGE COEFFICIENT OF VARIANCE: {0:.2f}%".format(self.mean_coef_variance)) |
| print("AVERAGE TIME PER PAGE: {avg}".format(avg=self._format_time(self.mean))) |
| print("GEOMETRIC MEAN: {avg}".format(avg=self._format_time(self.geometric_mean))) |
| print("------------------------------") |
| print("") |
| |
| def print_url_results(self, urlResultsType): |
| print("------------------------------") |
| print("{type} URL LOAD TIMES:".format(type=urlResultsType)) |
| if not len(self.urls): |
| print("") |
| return |
| if self.urls.values()[0].count > 1: |
| results_format_str = "{time}{var}{url}" |
| else: |
| results_format_str = "{time}{url}" |
| print(results_format_str.format(time="time (ms)".ljust(12), var="CoV (%)".ljust(10), url="url")) |
| for (url, results) in self.urls.items(): |
| results.print_results(url, results_format_str) |
| print("") |
| |
| def _format_time(self, time): |
| return "{} ms".format("{0:.2f}".format(float(time)).rstrip('0').rstrip('.')) |