[reSIProcate] the lazy-parser infrastructure, SipMessage, and pool-allocators
Byron Campen
bcampen at estacado.net
Mon Jun 26 14:29:39 CDT 2006
I have spent a lot of time profiling the resip stack recently, and
it seems that the amount of effort spent constructing/destructing the
plethora of objects that make up the lazy-parser infrastructure (ie,
HeaderFieldValueList, HeaderFieldValue, ParserContainerBase,
ParserContainer, LazyParser, and ParserCategory) exceeds the effort
we spend parsing by a wide margin. There are a few reasons for this:
First, we are constructing stl vectors to hold single-value headers
(To, From, CSeq, CallId, Max-Forwards, the RequestLine/StatusLine,
Contents, Expires, etc), which make up most of the often-used
headers. (I am referring to HeaderFieldValueList::mHeaders and
ParserContainerBase::mParsers here.) Having a class that was
specifically designed for this type of header could reduce overhead
substantially.
Second, when a SipMessage is copied, we allocate and memcpy for
every (unparsed) header-field-value in the message, instead of
leaning on the original message buffer and using some pointer-foo to
calculate offsets. Changing this would mean slightly more logic in
the application code (some pointer arithmetic), but malloc would not
churn as badly, memcpying the entire buffer once would be
substantially better than doing lots and lots of small memcpys of the
individual HeaderFieldValues, and deleting one large buffer is also
much, much better than deleting lots of small ones. We will probably
also save memory with this approach, because malloc usually gives
more memory than it is asked for.
Third, classes like Uri, NameAddr, Via, and so forth have a
ParserCategory and a LazyParser under the hood, whether they came
from the wire or not. Whenever we create a Uri in code (as opposed to
parsing it from the wire), it has to initialize a ParserCategory and
a LazyParser, even though their capabilities almost certainly won't
be used. However, changing this would be very difficult, and this
does not appear to be hurting us too badly right now.
In addition to these fixes, it may be helpful to pool-allocate
SipMessages. This would require some modifications to SipMessage, but
this should not be too hard. The downside of this approach is
maintainability; if someone changes SipMessage by adding a member, we
would have to ensure that the member is cleared before returning it
to the pool.
Does anyone have an opinion on this?
Best regards,
Byron Campen
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2369 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20060626/bbda78a8/attachment.bin>
More information about the resiprocate-devel
mailing list