diff --git a/CHANGELOG.md b/CHANGELOG.md index 4045159d..a3a8c390 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Version 91: * source.dox is path-independent * Tidy up namespace qualifiers * Tidy up MSVC CMakeLists.txt +* Optimize buffered_read_stream WebSocket: diff --git a/include/boost/beast/core/buffered_read_stream.hpp b/include/boost/beast/core/buffered_read_stream.hpp index 423b4d12..7d38b5c2 100644 --- a/include/boost/beast/core/buffered_read_stream.hpp +++ b/include/boost/beast/core/buffered_read_stream.hpp @@ -97,7 +97,7 @@ class buffered_read_stream template class read_some_op; - DynamicBuffer sb_; + DynamicBuffer buffer_; std::size_t capacity_ = 0; Stream next_layer_; @@ -180,14 +180,14 @@ public: DynamicBuffer& buffer() { - return sb_; + return buffer_; } /// Access the internal buffer DynamicBuffer const& buffer() const { - return sb_; + return buffer_; } /** Set the maximum buffer size. diff --git a/include/boost/beast/core/impl/buffered_read_stream.ipp b/include/boost/beast/core/impl/buffered_read_stream.ipp index cf70e27f..020a16c0 100644 --- a/include/boost/beast/core/impl/buffered_read_stream.ipp +++ b/include/boost/beast/core/impl/buffered_read_stream.ipp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -96,7 +97,7 @@ read_some_op::operator()( switch(step_) { case 0: - if(s_.sb_.size() == 0) + if(s_.buffer_.size() == 0) { if(s_.capacity_ == 0) { @@ -109,8 +110,9 @@ read_some_op::operator()( // read step_ = 2; return s_.next_layer_.async_read_some( - s_.sb_.prepare(s_.capacity_), - std::move(*this)); + s_.buffer_.prepare(read_size( + s_.buffer_, s_.capacity_)), + std::move(*this)); } step_ = 3; @@ -123,13 +125,13 @@ read_some_op::operator()( break; case 2: - s_.sb_.commit(bytes_transferred); + s_.buffer_.commit(bytes_transferred); BOOST_BEAST_FALLTHROUGH; case 3: bytes_transferred = - boost::asio::buffer_copy(b_, s_.sb_.data()); - s_.sb_.consume(bytes_transferred); + boost::asio::buffer_copy(b_, s_.buffer_.data()); + s_.buffer_.consume(bytes_transferred); break; } h_(ec, bytes_transferred); @@ -198,12 +200,13 @@ read_some(MutableBufferSequence const& buffers, "MutableBufferSequence requirements not met"); using boost::asio::buffer_size; using boost::asio::buffer_copy; - if(sb_.size() == 0) + if(buffer_.size() == 0) { if(capacity_ == 0) return next_layer_.read_some(buffers, ec); - sb_.commit(next_layer_.read_some( - sb_.prepare(capacity_), ec)); + buffer_.commit(next_layer_.read_some( + buffer_.prepare(read_size(buffer_, + capacity_)), ec)); if(ec) return 0; } @@ -212,8 +215,8 @@ read_some(MutableBufferSequence const& buffers, ec.assign(0, ec.category()); } auto bytes_transferred = - buffer_copy(buffers, sb_.data()); - sb_.consume(bytes_transferred); + buffer_copy(buffers, buffer_.data()); + buffer_.consume(bytes_transferred); return bytes_transferred; } @@ -230,6 +233,9 @@ async_read_some(MutableBufferSequence const& buffers, static_assert(is_mutable_buffer_sequence< MutableBufferSequence>::value, "MutableBufferSequence requirements not met"); + if(buffer_.size() == 0 && capacity_ == 0) + return next_layer_.async_read_some(buffers, + std::forward(handler)); async_completion init{handler}; read_some_op