[Python-Dev] A fast startup patch (was: Python startup time)
Gregory P. Smith
greg at krypto.org
Thu May 3 20:24:03 EDT 2018
+1 to the concept!
On Thu, May 3, 2018 at 1:13 PM, Carl Shapiro <carl.shapiro at gmail.com> wrote:
> Hello,
>
> Yesterday Neil Schemenauer mentioned some work that a colleague of mine
> (CCed) and I have done to improve CPython start-up time. Given the recent
> discussion, it seems timely to discuss what we are doing and whether it is
> of interest to other people hacking on the CPython runtime.
>
> There are many ways to reduce the start-up time overhead. For this
> experiment, we are specifically targeting the cost of unmarshaling heap
> objects from compiled Python bytecode. Our measurements show this specific
> cost to represent 10% to 25% of the start-up time among the applications we
> have examined.
>
> Our approach to eliminating this overhead is to store unmarshaled objects
> into the data segment of the python executable. We do this by processing
> the compiled python bytecode for a module, creating native object code with
> the unmarshaled objects in their in-memory representation, and linking this
> into the python executable.
>
> When a module is imported, we simply return a pointer to the top-level
> code object in the data segment directly without invoking the unmarshaling
> code or touching the file system. What we are doing is conceptually
> similar to the existing capability to freeze a module, but we avoid
> non-trivial unmarshaling costs.
>
> The patch is still under development and there is still a little bit more
> work to do. With that in mind, the numbers look good but please take these
> with a grain of salt
>
> Baseline
>
> $ bench "./python.exe -c ''"
> benchmarking ./python.exe -c ''
> time 31.46 ms (31.24 ms .. 31.78 ms)
> 1.000 R² (0.999 R² .. 1.000 R²)
> mean 32.08 ms (31.82 ms .. 32.63 ms)
> std dev 778.1 μs (365.6 μs .. 1.389 ms)
>
> $ bench "./python.exe -c 'import difflib'"
> benchmarking ./python.exe -c 'import difflib'
> time 32.82 ms (32.64 ms .. 33.02 ms)
> 1.000 R² (1.000 R² .. 1.000 R²)
> mean 33.17 ms (33.01 ms .. 33.44 ms)
> std dev 430.7 μs (233.8 μs .. 675.4 μs)
>
>
> With our patch
>
> $ bench "./python.exe -c ''"
> benchmarking ./python.exe -c ''
> time 24.86 ms (24.62 ms .. 25.08 ms)
> 0.999 R² (0.999 R² .. 1.000 R²)
> mean 25.58 ms (25.36 ms .. 25.94 ms)
> std dev 592.8 μs (376.2 μs .. 907.8 μs)
>
> $ bench "./python.exe -c 'import difflib'"
> benchmarking ./python.exe -c 'import difflib'
> time 25.30 ms (25.00 ms .. 25.55 ms)
> 0.999 R² (0.998 R² .. 1.000 R²)
> mean 26.78 ms (26.30 ms .. 27.64 ms)
> std dev 1.413 ms (747.5 μs .. 2.250 ms)
> variance introduced by outliers: 20% (moderately inflated)
>
>
> Here are some numbers with the patch but with the stat calls preserved to
> isolate just the marshaling effects
>
> Baseline
>
> $ bench "./python.exe -c 'import difflib'"
> benchmarking ./python.exe -c 'import difflib'
> time 34.67 ms (33.17 ms .. 36.52 ms)
> 0.995 R² (0.990 R² .. 1.000 R²)
> mean 35.36 ms (34.81 ms .. 36.25 ms)
> std dev 1.450 ms (1.045 ms .. 2.133 ms)
> variance introduced by outliers: 12% (moderately inflated)
>
>
> With our patch (and calls to stat)
>
> $ bench "./python.exe -c 'import difflib'"
> benchmarking ./python.exe -c 'import difflib'
> time 30.24 ms (29.02 ms .. 32.66 ms)
> 0.988 R² (0.968 R² .. 1.000 R²)
> mean 31.86 ms (31.13 ms .. 32.75 ms)
> std dev 1.789 ms (1.329 ms .. 2.437 ms)
> variance introduced by outliers: 17% (moderately inflated)
>
>
> (This work was done in CPython 3.6 and we are exploring back-porting to
> 2.7 so we can run the hg startup benchmarks in the performance test suite.)
>
> This is effectively a drop-in replacement for the frozen module capability
> and (so far) required only minimal changes to the runtime. To us, it seems
> like a very nice win without compromising on compatibility or complexity.
> I am happy to discuss more of the technical details until we have a public
> patch available.
>
> I hope this provides some optimism around the possibility of improving the
> start-up time of CPython. What do you all think?
>
> Kindly,
>
> Carl
>
>
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> https://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: https://mail.python.org/mailman/options/python-dev/
> greg%40krypto.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20180503/1decd412/attachment.html>
More information about the Python-Dev
mailing list