> On Mar 16, 2017, at 10:09, Gregory Szorc <gregory.sz...@gmail.com> wrote:
> 
>> On Thu, Mar 16, 2017 at 9:50 AM, Augie Fackler <r...@durin42.com> wrote:
>> On Mon, Mar 13, 2017 at 10:24:21PM -0700, Gregory Szorc wrote:
>> > On Mon, Mar 13, 2017 at 10:15 PM, Gregory Szorc <gregory.sz...@gmail.com>
>> > wrote:
>> > Assuming there is some truth to the numbers, holy cow the overhead of
>> > PyObject creation is crazy. I suddenly feel like auditing the C code for
>> > everywhere we're instantiating PyObjects before it is necessary. I know we
>> > do this in the revlog index. I wonder if dirstate is impacted...
>> 
>> Yeah, PyObject allocation can be pretty nasty. In my toy rust version
>> of fm1readmarkers, it's 100x faster than the C code was, then 3x
>> slower overall due to time spent copying data into PyObjects.
>> 
> !!!

Yeah, the actual parsing step was so fast I almost didn't believe it. Zero-copy 
parsers are pretty great.

> 
> If it is 3x slower in the end, I highly suspect something sub-optimal with 
> the Rust -> PyObject code path. My guess would be having to allocate memory 
> and copy data for the hashes into PyBytes instances. We can leverage 
> memoryview or any object implementing the buffer protocol so we can avoid 
> that copy. You still pay for the PyObject overhead. But at least you aren't 
> making extra copies of data.

My suspicion is that it's all the string copies, yeah. I also have wondered 
about the bindings I'm using doing something suboptimal with the GIL, but I 
haven't had time to wade through it or try and profile it.

> 
> Also, I'm really curious when obs markers actually need to be realized. There 
> is validation after parsing that successors aren't nullid. That can easily be 
> inlined into C or deferred until first access. In theory, we could create our 
> own Python type behaving as a sequence that turned C structs to PyObjects on 
> demand. I'm just not sure if that buys us anything. The second you iterate 
> over markers from Python, you throw away that optimization. 
> 
> Perhaps it would be better for the obs marker API to conceptually be a black 
> box store that exposed primitives like "find X for <set>." That way, all the 
> expensive computation can be done in C on raw data structures and we only 
> realize PyObjects as needed. For cases where you are dealing with lists of 
> fixed-width values, you could return an array of packed data instead of N 
> PyObjects. Come to think of it, the computation of just hidden nodes might be 
> the only super critical part to be all in Python. If we can do that in C 
> without realizing tons PyObjects, I think a lot of read-only 
> operations/commands just got a lot faster.

If we build that interface, the rust code I've got sitting around (using nom) 
is probably actually worth exploring in more detail.
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to