> On Oct 18, 2016, at 7:09 PM, Kevin Conway <kevinjacobcon...@gmail.com> wrote:
> 
> > making such aggressive use of private APIs that it could win a contest 
> > about how to ensure that you break on every new release of Twisted :)
> 
> We're very aware of that! It's one of the reasons we have the test matrix set 
> up to run multiple versions of Python and Twisted. I have not started on 16.X 
> compatibility yet.
> 
>  >  I imagine that it's a non-trivial impact to performance, so it would be 
> worthwhile to track that.
> 
> We put this this through some extensive benchmarks and testing to measure the 
> performance impact. For example, the details are logged in a commit message 
> but, we initially implemented the @inlineCallbacks extension as a coroutine 
> wrapper. However, we found that the way t.p.Failure tries to serialize 
> itself, and its local+global scopes, to a dictionary caused enormous memory 
> and CPU consumption when triggered because of the added objects in those 
> spaces. The negative impact grew exponentially with levels of nested 
> coroutines. Very bad day.

What are you referring to as a "coroutine" here?  A generator?  And exponential 
growth, you say?  That sounds very surprising.

> Once we pivoted to a small fork of @inlineCallbacks, we measured the overall 
> performance hit to be negligible in our services. I'll dig around to see if I 
> can find where we documented the actual numbers we saw. At a macro level, our 
> service wide stats showed no meaningful growth of runtime or memory 
> consumption.

Does this mean you only get context tracking against inlineCallbacks, and not 
other usages of Deferred?

> > digression on "Don't Switch In The Core"
> 
> I was surprised at how much switching this context implementation was when we 
> put it in the lower level read/write callbacks. Each of our services process 
> a large amount of continually streaming data and our profiles show, IIRC, 
> that one of the top 5 consumers of CPU time was calling the read/write 
> callbacks. When we added this to those paths it increased overall CPU usage 
> by double digit percentage points. If this feature were available as an 
> opt-in reactor extension then providers could capacity plan around the 
> performance hit. We found it more valuable to move the switching closer to 
> application protocol code where switches happen less frequently.

Maybe "switching" is more expensive than I realized.  Where is this implemented?

>   > I also take it from the performance notes that you're not using PyPy?
> 
> We're still on cPython. PyPy is something we've talked about before but 
> haven't invested much time into yet. I don't know to what extent PyPy might 
> change the performance characteristics of the project.

As I always tell people - if you care about performance, PyPy should be step 
zero.  Optimizing for CPython looks like adding weird implementation-specific 
hacks that might start working or be backwards in the next version; optimizing 
for PyPy means making the code simpler and more readable so the JIT can figure 
out what to do ;).  So the pressure that optimizing for PyPy exerts on your 
code is generally a lot healthier.

-glyph
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to