Author: Anton Gulenko <anton.gule...@googlemail.com> Branch: storage Changeset: r853:689aa666070e Date: 2014-06-23 19:14 +0200 http://bitbucket.org/pypy/lang-smalltalk/changeset/689aa666070e/
Log: Added histogram output for storage statistics. diff --git a/spyvm/storage_statistics.py b/spyvm/storage_statistics.py --- a/spyvm/storage_statistics.py +++ b/spyvm/storage_statistics.py @@ -32,20 +32,18 @@ old_storage = None size = w_obj.size() - key = self.make_key(operation, old_storage, new_storage) if self.using_classname and log_classname: classname = w_obj.guess_classname() else: classname = None for module in self.modules: + key = module.make_key(operation, old_storage, new_storage) module.storage_operation(key, size, classname) - def make_key(self, operation, old_storage, new_storage): - return (operation, old_storage, new_storage) - def print_results(self): for module in self.modules: module.print_results() + print "\n\n" class StatisticsModule(object): uses_classname = False @@ -53,6 +51,8 @@ raise NotImplementedError("Abstract class") def print_results(self): raise NotImplementedError("Abstract class") + def make_key(self, operation, old_storage, new_storage): + return (operation, old_storage, new_storage) def key_string(self, key): if key[1]: return "%s (%s -> %s)" % (key[0], key[1], key[2]) @@ -82,17 +82,46 @@ def storage_operation(self, operation_key, storage_size, container_classname): if not operation_key in self.stats: self.stats[operation_key] = self.initial_value() - self.increment_value(self.stats[operation_key], storage_size) + self.increment_value(self.stats[operation_key], storage_size, container_classname) def sorted_keys(self): keys = [ x for x in self.stats ] StatsSorter(keys).sort() return keys +class HistogramStatisticsCollector(AbstractStatisticsCollector): + # Stores classnames with sizes + # Value: map <classname, (count, elements)> + + uses_classname = True + def initial_value(self): return {} + def increment_value(self, value_object, storage_size, container_classname): + if not container_classname in value_object: + value_object[container_classname] = [0, 0] + m = value_object[container_classname] + m[0] = m[0] + storage_size + m[1] = m[1] + 1 + + def make_key(self, operation, old_storage, new_storage): + return (new_storage) + + def print_results(self): + print "## Histogram statistics:" + for key in self.sorted_keys(): + print "##" + print "# %s" % key + print "Data Objects Elements" + classes = self.stats[key] + for cls in classes: + tuple = classes[cls] + sum = tuple[0] + num = tuple[1] + print "%s\t%d\t%d" % (cls, num, sum) + class StatisticsCollector(AbstractStatisticsCollector): # Value: [total_size, num_operations] def initial_value(self): return [0, 0] - def increment_value(self, value_object, storage_size): + def increment_value(self, value_object, storage_size, container_classname): value_object[0] = value_object[0] + storage_size value_object[1] = value_object[1] + 1 def print_results(self): @@ -106,7 +135,7 @@ class DotStatisticsCollector(StatisticsCollector): def __init__(self): - AbstractStatisticsCollector.__init__(self) + StatisticsCollector.__init__(self) self.incoming_operations = {} self.incoming_elements = {} self.outgoing_operations = {} @@ -181,7 +210,7 @@ class DetailedStatisticsCollector(AbstractStatisticsCollector): # Value: list of numbers (sizes) def initial_value(self): return [] - def increment_value(self, value_object, storage_size): + def increment_value(self, value_object, storage_size, container_classname): value_object.append(storage_size) def print_results(self): print "Detailed Storage Statistics:" @@ -195,8 +224,9 @@ _collector = StatisticsCollector() _detailedcollector = DetailedStatisticsCollector() _dotcollector = DotStatisticsCollector() +_histogramcollector = HistogramStatisticsCollector() -def activate_statistics(log=False, statistics=False, detailed_statistics=False, dot=False): +def activate_statistics(log=False, statistics=False, detailed_statistics=False, dot=False, histogram=False): if log: _stats.add_module(_logger) if statistics: @@ -207,6 +237,8 @@ _stats.add_module(_dotcollector) # Start a comment in order to make the entire output valid dot code. Hack. print "/*" + if histogram: + _stats.add_module(_histogramcollector) def print_statistics(): _stats.print_results() diff --git a/targetimageloadingsmalltalk.py b/targetimageloadingsmalltalk.py --- a/targetimageloadingsmalltalk.py +++ b/targetimageloadingsmalltalk.py @@ -134,6 +134,7 @@ --strategy-stats --strategy-stats-dot --strategy-stats-details + --strategy-stats-histogram [image path, default: Squeak.image] """ % (argv[0], constants.MAX_LOOP_DEPTH) @@ -204,6 +205,8 @@ storage_statistics.activate_statistics(statistics=True) elif arg == "--strategy-stats-dot": storage_statistics.activate_statistics(dot=True) + elif arg == "--strategy-stats-histogram": + storage_statistics.activate_statistics(histogram=True) elif arg == "--strategy-stats-details": storage_statistics.activate_statistics(statistics=True, detailed_statistics=True) elif path is None: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit