[Python-Dev] Opcode cache in ceval loop

Yury Selivanov yselivanov.ml at gmail.com
Wed Feb 3 16:22:28 EST 2016



On 2016-02-03 3:53 PM, francismb wrote:
> Hi,
>
> On 02/01/2016 10:43 PM, Yury Selivanov wrote:
>
>> 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.
>>
> Aren't those hits/misses a way to see how dynamic the code is? I mean
> can't the current magic (manually tweaked on a limited set) values,
> be self tweaked/adapted on those numbers?


Probably.

One way of tackling this is to give each optimized opcode
a counter for hit/misses.  When we have a "hit" we increment
that counter, when it's a miss, we decrement it.

I kind of have something like that right now:
https://github.com/1st1/cpython/blob/opcache5/Python/ceval.c#L3035

But I only decrement that counter -- the idea is that LOAD_ATTR
is allowed to "miss" only 20 times before getting deoptimized.

I'll experiment with inc/dec on hit/miss and see how that affects
the performance.

An ideal way would be to calculate a hit/miss ratio over time
for each cached opcode, but that would be an expensive
calculation.

Yury



More information about the Python-Dev mailing list