From dced5816df3c605feb4b8d3bd1804b340f21483c Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Mon, 11 Nov 2013 15:17:52 -0500 Subject: [PATCH] RVO optimization of output buffer generation --- Server/BasicDatastructures.h | 12 ++++-------- Server/Connection.h | 12 +++++++----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Server/BasicDatastructures.h b/Server/BasicDatastructures.h index 90dad8c3f..9bd85276f 100644 --- a/Server/BasicDatastructures.h +++ b/Server/BasicDatastructures.h @@ -80,8 +80,8 @@ struct Reply { } status; std::vector
headers; - std::vector toBuffers(); - std::vector HeaderstoBuffers(); + void ToBuffers(std::vector&); + void HeadersToBuffers(std::vector&); std::string content; static Reply stockReply(status_type status); void setSize(const unsigned size) { @@ -116,8 +116,7 @@ std::string ToString(Reply::status_type status) { } } -std::vector Reply::toBuffers(){ - std::vector buffers; +void Reply::ToBuffers( std::vector & buffers ){ buffers.push_back(ToBuffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { Header& h = headers[i]; @@ -128,11 +127,9 @@ std::vector Reply::toBuffers(){ } buffers.push_back(boost::asio::buffer(crlf)); buffers.push_back(boost::asio::buffer(content)); - return buffers; } -std::vector Reply::HeaderstoBuffers(){ - std::vector buffers; +void Reply::HeadersToBuffers( std::vector& buffers ){ buffers.push_back(ToBuffer(status)); for (std::size_t i = 0; i < headers.size(); ++i) { Header& h = headers[i]; @@ -142,7 +139,6 @@ std::vector Reply::HeaderstoBuffers(){ buffers.push_back(boost::asio::buffer(crlf)); } buffers.push_back(boost::asio::buffer(crlf)); - return buffers; } Reply Reply::stockReply(Reply::status_type status) { diff --git a/Server/Connection.h b/Server/Connection.h index d5a3cfa5c..9ec19b63a 100644 --- a/Server/Connection.h +++ b/Server/Connection.h @@ -87,13 +87,13 @@ private: &compression_type ); + std::vector output_buffer; if( result ) { request.endpoint = TCP_socket.remote_endpoint().address(); request_handler.handle_request(request, reply); Header compression_header; std::vector compressed_output; - std::vector output_buffer; switch(compression_type) { case deflateRFC1951: compression_header.name = "Content-Encoding"; @@ -109,7 +109,7 @@ private: compression_type ); reply.setSize(compressed_output.size()); - output_buffer = reply.HeaderstoBuffers(); + reply.HeadersToBuffers(output_buffer); output_buffer.push_back( boost::asio::buffer(compressed_output) ); @@ -139,7 +139,7 @@ private: compression_type ); reply.setSize(compressed_output.size()); - output_buffer = reply.HeaderstoBuffers(); + reply.HeadersToBuffers(output_buffer); output_buffer.push_back( boost::asio::buffer(compressed_output) ); @@ -156,9 +156,10 @@ private: ); break; case noCompression: + reply.HeadersToBuffers(output_buffer); boost::asio::async_write( TCP_socket, - reply.toBuffers(), + output_buffer, strand.wrap( boost::bind( &Connection::handle_write, @@ -171,9 +172,10 @@ private: } } else if (!result) { reply = Reply::stockReply(Reply::badRequest); + reply.HeadersToBuffers(output_buffer); boost::asio::async_write( TCP_socket, - reply.toBuffers(), + output_buffer, strand.wrap( boost::bind( &Connection::handle_write,