Optimize buffered_read_stream

fix #651
This commit is contained in:
Vinnie Falco
2017-07-27 13:08:59 -07:00
parent fd1b236159
commit 07535d6289
3 changed files with 21 additions and 14 deletions

View File

@@ -5,6 +5,7 @@ Version 91:
* source.dox is path-independent * source.dox is path-independent
* Tidy up namespace qualifiers * Tidy up namespace qualifiers
* Tidy up MSVC CMakeLists.txt * Tidy up MSVC CMakeLists.txt
* Optimize buffered_read_stream
WebSocket: WebSocket:

View File

@@ -97,7 +97,7 @@ class buffered_read_stream
template<class Buffers, class Handler> template<class Buffers, class Handler>
class read_some_op; class read_some_op;
DynamicBuffer sb_; DynamicBuffer buffer_;
std::size_t capacity_ = 0; std::size_t capacity_ = 0;
Stream next_layer_; Stream next_layer_;
@@ -180,14 +180,14 @@ public:
DynamicBuffer& DynamicBuffer&
buffer() buffer()
{ {
return sb_; return buffer_;
} }
/// Access the internal buffer /// Access the internal buffer
DynamicBuffer const& DynamicBuffer const&
buffer() const buffer() const
{ {
return sb_; return buffer_;
} }
/** Set the maximum buffer size. /** Set the maximum buffer size.

View File

@@ -13,6 +13,7 @@
#include <boost/beast/core/bind_handler.hpp> #include <boost/beast/core/bind_handler.hpp>
#include <boost/beast/core/error.hpp> #include <boost/beast/core/error.hpp>
#include <boost/beast/core/handler_ptr.hpp> #include <boost/beast/core/handler_ptr.hpp>
#include <boost/beast/core/read_size.hpp>
#include <boost/beast/core/type_traits.hpp> #include <boost/beast/core/type_traits.hpp>
#include <boost/beast/core/detail/config.hpp> #include <boost/beast/core/detail/config.hpp>
#include <boost/asio/handler_alloc_hook.hpp> #include <boost/asio/handler_alloc_hook.hpp>
@@ -96,7 +97,7 @@ read_some_op<MutableBufferSequence, Handler>::operator()(
switch(step_) switch(step_)
{ {
case 0: case 0:
if(s_.sb_.size() == 0) if(s_.buffer_.size() == 0)
{ {
if(s_.capacity_ == 0) if(s_.capacity_ == 0)
{ {
@@ -109,8 +110,9 @@ read_some_op<MutableBufferSequence, Handler>::operator()(
// read // read
step_ = 2; step_ = 2;
return s_.next_layer_.async_read_some( return s_.next_layer_.async_read_some(
s_.sb_.prepare(s_.capacity_), s_.buffer_.prepare(read_size(
std::move(*this)); s_.buffer_, s_.capacity_)),
std::move(*this));
} }
step_ = 3; step_ = 3;
@@ -123,13 +125,13 @@ read_some_op<MutableBufferSequence, Handler>::operator()(
break; break;
case 2: case 2:
s_.sb_.commit(bytes_transferred); s_.buffer_.commit(bytes_transferred);
BOOST_BEAST_FALLTHROUGH; BOOST_BEAST_FALLTHROUGH;
case 3: case 3:
bytes_transferred = bytes_transferred =
boost::asio::buffer_copy(b_, s_.sb_.data()); boost::asio::buffer_copy(b_, s_.buffer_.data());
s_.sb_.consume(bytes_transferred); s_.buffer_.consume(bytes_transferred);
break; break;
} }
h_(ec, bytes_transferred); h_(ec, bytes_transferred);
@@ -198,12 +200,13 @@ read_some(MutableBufferSequence const& buffers,
"MutableBufferSequence requirements not met"); "MutableBufferSequence requirements not met");
using boost::asio::buffer_size; using boost::asio::buffer_size;
using boost::asio::buffer_copy; using boost::asio::buffer_copy;
if(sb_.size() == 0) if(buffer_.size() == 0)
{ {
if(capacity_ == 0) if(capacity_ == 0)
return next_layer_.read_some(buffers, ec); return next_layer_.read_some(buffers, ec);
sb_.commit(next_layer_.read_some( buffer_.commit(next_layer_.read_some(
sb_.prepare(capacity_), ec)); buffer_.prepare(read_size(buffer_,
capacity_)), ec));
if(ec) if(ec)
return 0; return 0;
} }
@@ -212,8 +215,8 @@ read_some(MutableBufferSequence const& buffers,
ec.assign(0, ec.category()); ec.assign(0, ec.category());
} }
auto bytes_transferred = auto bytes_transferred =
buffer_copy(buffers, sb_.data()); buffer_copy(buffers, buffer_.data());
sb_.consume(bytes_transferred); buffer_.consume(bytes_transferred);
return bytes_transferred; return bytes_transferred;
} }
@@ -230,6 +233,9 @@ async_read_some(MutableBufferSequence const& buffers,
static_assert(is_mutable_buffer_sequence< static_assert(is_mutable_buffer_sequence<
MutableBufferSequence>::value, MutableBufferSequence>::value,
"MutableBufferSequence requirements not met"); "MutableBufferSequence requirements not met");
if(buffer_.size() == 0 && capacity_ == 0)
return next_layer_.async_read_some(buffers,
std::forward<ReadHandler>(handler));
async_completion<ReadHandler, async_completion<ReadHandler,
void(error_code, std::size_t)> init{handler}; void(error_code, std::size_t)> init{handler};
read_some_op<MutableBufferSequence, handler_type< read_some_op<MutableBufferSequence, handler_type<