diff -r 9a1136898539 perf.py --- a/perf.py Thu Oct 24 21:59:09 2013 +0200 +++ b/perf.py Fri Nov 29 20:11:33 2013 -0800 @@ -1631,12 +1631,17 @@ @VersionRange() def BM_FastPickle(base_python, changed_python, options): - args = ["--use_cpickle", "pickle"] + args = ["--use_cpickle", "pickle", "--protocol", "4"] return _PickleBenchmark(base_python, changed_python, options, args) @VersionRange() def BM_FastUnpickle(base_python, changed_python, options): - args = ["--use_cpickle", "unpickle"] + args = ["--use_cpickle", "unpickle", "--protocol", "4"] + 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() 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 Fri Nov 29 20:11:33 2013 -0800 @@ -23,6 +23,7 @@ import random import sys import time +import io # Local imports import util @@ -297,6 +298,56 @@ return times +FRAME_SIZE = 64 * 1024 +STRINGS = [bytes([i >> 8, i & 0xff]) * (FRAME_SIZE // 2) for i in range(512)] + +def test_unpickle_file(loops, pickle, options): + class SlowReader: + + LOOPS = 1000 + + def __init__(self, f): + self._read = f.read + self.readline = f.readline + + def read(self, n): + for _ in range(self.LOOPS): pass + return self._read(n) + + def loads(pickled): + with io.BytesIO(pickled) as f: + pickle.load(SlowReader(f)) + + pickled_list = pickle.dumps(STRINGS, options.protocol) + + # Warm-up runs. + loads(pickled_list) + loads(pickled_list) + + times = [] + for _ in xrange(options.num_runs): + t0 = time.time() + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + loads(pickled_list) + 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 +382,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]