[Python-ideas] More compact bytecode
MRAB
python at mrabarnett.plus.com
Thu Feb 4 13:26:50 EST 2016
On 2016-02-04 17:28:45, "Andrew Barnert via Python-ideas"
<python-ideas at python.org> wrote:
>On Thursday, February 4, 2016 8:55 AM, Serhiy Storchaka
><storchaka at gmail.com> wrote:
>
>> > On 04.02.16 18:16, Victor Stinner wrote:
>
>
>>>> 2. Use 16-bit opcodes as in WPython.
>>>
>>> IMHO this is a much more interesting option.
>>>
>>> It would be great to remove "if (HAS_ARG(opcode)) oparg =
>> NEXTARG();"
>>> and always get the argument from the 16-bit opcode. This if() adds
>>> more work to the CPU which has to flush the pipeline on branch
>>> misprediction. Usually, it doesn't matter. For this if() is really
>>> part of the hot path code Python, it's the most important loop
>>>running
>>> the bytecode. So any instruction matters here ;-)
>>
>> Actually in common case this "if" is executed at compile time. But I
>> expect a benefit from using simple read of 16-bit value instead of 3
>> reads of 8-bit values.
>
>Only if the 16-bit reads are aligned. Can that be guaranteed somehow?
>
Aren't allocated blocks usually aligned to n-byte boundaries (or
multiples thereof) anyway, where n is the number of bytes needed to hold
an address?
>If you change co_code to some type that's like bytes, but an immutable
>array of shorts instead of bytes, that would certainly do it. And it
>would be easier to inspect/hack 16-bit bytecodes from Python if you
>didn't have to look at them as bytes. But that implies creating the new
>type, exposing it to Python, and changing what co_code returns.
>
>Or it could just be a simple switch when constructing a code object: if
>the code argument is aligned, use it as-is; if not, copy its contents
>into an aligned array, build a new bytes around that, and store that
>instead. (Would that significantly slow down .pyc reads and other
>marshaling uses, if half of all code objects have to copy their
>contents?)
>
More information about the Python-ideas
mailing list