diff -r 9a1136898539 perf.py --- a/perf.py Thu Oct 24 21:59:09 2013 +0200 +++ b/perf.py Tue Nov 26 23:01:49 2013 -0800 @@ -1640,6 +1640,11 @@ return _PickleBenchmark(base_python, changed_python, options, args) @VersionRange() +def BM_Unpickle_File(base_python, changed_python, options): + args = ["--use_cpickle", "unpickle_file", "--protocol", "4"] + return _PickleBenchmark(base_python, changed_python, options, args) + +@VersionRange() def BM_Pickle_List(base_python, changed_python, options): args = ["--use_cpickle", "pickle_list"] return _PickleBenchmark(base_python, changed_python, options, args) diff -r 9a1136898539 performance/bm_pickle.py --- a/performance/bm_pickle.py Thu Oct 24 21:59:09 2013 +0200 +++ b/performance/bm_pickle.py Tue Nov 26 23:01:49 2013 -0800 @@ -23,6 +23,7 @@ import random import sys import time +import io # Local imports import util @@ -297,6 +298,53 @@ return times +def test_unpickle_file(loops, pickle, options): + pickled_list = pickle.dumps(LIST, options.protocol) + pickled_dict = pickle.dumps(DICT, options.protocol) + pickled_tuple = pickle.dumps(TUPLE, options.protocol) + pickled_dict_group = pickle.dumps(DICT_GROUP, options.protocol) + + class SlowBytesIO(io.BytesIO): + def read(self, n): + for _ in range(2000): pass + return super().read(n) + + def loads(pickled): + with SlowBytesIO(pickled) as f: + pickle.load(f) + + # Warm-up runs. + loads(pickled_list) + loads(pickled_list) + loads(pickled_dict) + loads(pickled_dict) + + loops = loops // 80 # Scale to compensate for the workload. + times = [] + for _ in xrange(options.num_runs): + t0 = time.time() + for _ in xrange(loops): + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_dict) + loads(pickled_dict) + loads(pickled_dict) + loads(pickled_dict) + loads(pickled_tuple) + loads(pickled_tuple) + loads(pickled_tuple) + loads(pickled_tuple) + loads(pickled_dict_group) + loads(pickled_dict_group) + loads(pickled_dict_group) + loads(pickled_dict_group) + t1 = time.time() + times.append(t1 - t0) + return times + + MICRO_DICT = dict((key, dict.fromkeys(range(10))) for key in xrange(100)) def test_pickle_dict(loops, pickle, options): @@ -331,7 +379,7 @@ options, args = parser.parse_args() benchmarks = ["pickle", "unpickle", "pickle_list", "unpickle_list", - "pickle_dict"] + "pickle_dict", "unpickle_file"] for bench_name in benchmarks: if bench_name in args: benchmark = globals()["test_" + bench_name]