[Python-Dev] Opcode cache in ceval loop
Yury Selivanov
yselivanov.ml at gmail.com
Mon Feb 1 16:43:23 EST 2016
Sven,
On 2016-02-01 4:32 PM, Sven R. Kunze wrote:
> On 01.02.2016 22:27, Yury Selivanov wrote:
>> Right now they are private constants in ceval.c.
>>
>> I will (maybe) expose a private API via the _testcapi module to
>> re-define them (set them to 1 or 0), only to write better unittests.
>> I have no plans to make those constants public or have a public API
>> to tackle them. IMHO, this is something that almost nobody will ever
>> use.
>
> Alright. I agree with you on that.
>
> What I actually meant was: how can we find the optimal values? I
> understand that 1000 and 20 are some hand-figured/subjective values
> for now.
>
> Is there standardized/objective way to find out the best values? What
> does best even mean here?
Running lots of benchmarks and micro-benchmarks hundreds of times ;)
I've done a lot of that, and I noticed that the numbers don't matter too
much.
What matters is that we don't want to optimize the code that runs 0 or 1
times. To save some memory we don't want to optimize the code that runs
10 times. So 1000 seems to be about right.
We also need to deoptimize the code to avoid having too many cache
misses/pointless cache updates. I found that, for instance, LOAD_ATTR
is either super stable (hits 100% of times), or really unstable, so 20
misses is, again, seems to be alright.
I'm flexible about tweaking those values, I encourage you and everyone
to experiment, if you have time ;)
https://github.com/1st1/cpython/blob/opcache5/Python/ceval.c#L100
Thanks,
Yury
More information about the Python-Dev
mailing list