From 06a08a874f518dc8bc5d1b9840447451c378e107 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Mon, 26 Jan 2015 13:35:24 +0100 Subject: [PATCH] fix performance regression in output generation, use copy elision and return result char array --- Server/Connection.cpp | 13 +++++++------ Server/Connection.h | 7 +++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Server/Connection.cpp b/Server/Connection.cpp index 366bb8619..af66f4a6a 100644 --- a/Server/Connection.cpp +++ b/Server/Connection.cpp @@ -86,7 +86,7 @@ void Connection::handle_read(const boost::system::error_code &error, std::size_t case deflateRFC1951: // use deflate for compression reply.headers.insert(reply.headers.begin(), {"Content-Encoding", "deflate"}); - CompressBufferCollection(reply.content, compression_type, compressed_output); + compressed_output = compress_buffers(reply.content, compression_type); reply.SetSize(static_cast(compressed_output.size())); output_buffer = reply.HeaderstoBuffers(); output_buffer.push_back(boost::asio::buffer(compressed_output)); @@ -94,7 +94,7 @@ void Connection::handle_read(const boost::system::error_code &error, std::size_t case gzipRFC1952: // use gzip for compression reply.headers.insert(reply.headers.begin(), {"Content-Encoding", "gzip"}); - CompressBufferCollection(reply.content, compression_type, compressed_output); + compressed_output = compress_buffers(reply.content, compression_type); reply.SetSize(static_cast(compressed_output.size())); output_buffer = reply.HeaderstoBuffers(); output_buffer.push_back(boost::asio::buffer(compressed_output)); @@ -142,9 +142,8 @@ void Connection::handle_write(const boost::system::error_code &error) } } -void Connection::CompressBufferCollection(std::vector uncompressed_data, - CompressionType compression_type, - std::vector &compressed_data) +std::vector Connection::compress_buffers(const std::vector &uncompressed_data, + const CompressionType compression_type) { boost::iostreams::gzip_params compression_parameters; @@ -156,12 +155,14 @@ void Connection::CompressBufferCollection(std::vector uncompressed_data, compression_parameters.noheader = true; } - BOOST_ASSERT(compressed_data.empty()); + std::vector compressed_data; // plug data into boost's compression stream boost::iostreams::filtering_ostream gzip_stream; gzip_stream.push(boost::iostreams::gzip_compressor(compression_parameters)); gzip_stream.push(boost::iostreams::back_inserter(compressed_data)); gzip_stream.write(&uncompressed_data[0], uncompressed_data.size()); boost::iostreams::close(gzip_stream); + + return compressed_data; } } diff --git a/Server/Connection.h b/Server/Connection.h index da0745450..cf59cddd6 100644 --- a/Server/Connection.h +++ b/Server/Connection.h @@ -1,6 +1,6 @@ /* -Copyright (c) 2013, Project OSRM, Dennis Luxen, others +Copyright (c) 2015, Project OSRM, Dennis Luxen, others All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -75,9 +75,8 @@ class Connection : public std::enable_shared_from_this /// Handle completion of a write operation. void handle_write(const boost::system::error_code &e); - void CompressBufferCollection(std::vector uncompressed_data, - CompressionType compression_type, - std::vector &compressed_data); + std::vector compress_buffers(const std::vector &uncompressed_data, + const CompressionType compression_type); boost::asio::io_service::strand strand; boost::asio::ip::tcp::socket TCP_socket;