Author: aconway Date: Thu Jan 22 13:48:47 2009 New Revision: 736810 URL: http://svn.apache.org/viewvc?rev=736810&view=rev Log: Optimization: cache results of AMQFrame::encodedSize().
Modified: qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h Modified: qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp?rev=736810&r1=736809&r2=736810&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.cpp Thu Jan 22 13:48:47 2009 @@ -30,7 +30,12 @@ namespace qpid { namespace framing { -void AMQFrame::init() { bof = eof = bos = eos = true; subchannel=0; channel=0; } +void AMQFrame::init() { + bof = eof = bos = eos = true; + subchannel=0; + channel=0; + encodedSizeCache = 0; +} AMQFrame::AMQFrame(const boost::intrusive_ptr<AMQBody>& b) : body(b) { init(); } @@ -38,13 +43,28 @@ AMQFrame::~AMQFrame() {} -void AMQFrame::setMethod(ClassId c, MethodId m) { body = MethodBodyFactory::create(c,m); } +AMQBody* AMQFrame::getBody() { + // Non-const AMQBody* may be used to modify the body. + encodedSizeCache = 0; + return body.get(); +} + +const AMQBody* AMQFrame::getBody() const { + return body.get(); +} + +void AMQFrame::setMethod(ClassId c, MethodId m) { + encodedSizeCache = 0; + body = MethodBodyFactory::create(c,m); +} uint32_t AMQFrame::encodedSize() const { - uint32_t size = frameOverhead() + body->encodedSize(); - if (body->getMethod()) - size += sizeof(ClassId)+sizeof(MethodId); - return size; + if (!encodedSizeCache) { + encodedSizeCache = frameOverhead() + body->encodedSize(); + if (body->getMethod()) + encodedSizeCache += sizeof(ClassId)+sizeof(MethodId); + } + return encodedSizeCache; } uint32_t AMQFrame::frameOverhead() { @@ -80,11 +100,13 @@ } bool AMQFrame::decode(Buffer& buffer) -{ +{ if(buffer.available() < frameOverhead()) return false; buffer.record(); + encodedSizeCache = 0; + uint32_t start = buffer.getPosition(); uint8_t flags = buffer.getOctet(); uint8_t framing_version = (flags & 0xc0) >> 6; if (framing_version != 0) @@ -133,7 +155,7 @@ throw IllegalArgumentException(QPID_MSG("Invalid frame type " << type)); } body->decode(buffer, body_size); - + encodedSizeCache = buffer.getPosition() - start; return true; } Modified: qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h?rev=736810&r1=736809&r2=736810&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h (original) +++ qpid/trunk/qpid/cpp/src/qpid/framing/AMQFrame.h Thu Jan 22 13:48:47 2009 @@ -43,8 +43,8 @@ ChannelId getChannel() const { return channel; } void setChannel(ChannelId c) { channel = c; } - AMQBody* getBody() { return body.get(); } - const AMQBody* getBody() const { return body.get(); } + AMQBody* getBody(); + const AMQBody* getBody() const; AMQMethodBody* getMethod() { return getBody()->getMethod(); } const AMQMethodBody* getMethod() const { return getBody()->getMethod(); } @@ -102,6 +102,7 @@ bool eof : 1; bool bos : 1; bool eos : 1; + mutable uint32_t encodedSizeCache; }; std::ostream& operator<<(std::ostream&, const AMQFrame&); --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org