From 5a2b8afeadcd1bf7c63b7228b416d4c4ba87614e Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 7 Dec 2014 13:26:45 +0800 Subject: [PATCH] for bug #251, add queue fast vector. 2.0.66 --- trunk/src/app/srs_app_source.cpp | 95 ++++++++++++++++++++++++- trunk/src/app/srs_app_source.hpp | 32 +++++++++ trunk/src/core/srs_core.hpp | 2 +- trunk/src/core/srs_core_performance.hpp | 5 ++ 4 files changed, 131 insertions(+), 3 deletions(-) diff --git a/trunk/src/app/srs_app_source.cpp b/trunk/src/app/srs_app_source.cpp index 287181244..341c8cf80 100644 --- a/trunk/src/app/srs_app_source.cpp +++ b/trunk/src/app/srs_app_source.cpp @@ -156,6 +156,93 @@ int SrsRtmpJitter::get_time() return (int)last_pkt_correct_time; } +#ifdef SRS_PERF_QUEUE_FAST_VECTOR +SrsFastVector::SrsFastVector() +{ + count = 0; + nb_msgs = SRS_PERF_MW_MSGS * 2; + msgs = new SrsSharedPtrMessage*[nb_msgs]; +} + +SrsFastVector::~SrsFastVector() +{ + free(); +} + +int SrsFastVector::size() +{ + return count; +} + +int SrsFastVector::begin() +{ + return 0; +} + +int SrsFastVector::end() +{ + return count; +} + +SrsSharedPtrMessage** SrsFastVector::data() +{ + return msgs; +} + +SrsSharedPtrMessage* SrsFastVector::at(int index) +{ + srs_assert(index < count); + return msgs[index]; +} + +void SrsFastVector::clear() +{ + count = 0; +} + +void SrsFastVector::erase(int _begin, int _end) +{ + srs_assert(_begin < _end); + + // move all erased to previous. + for (int i = 0; i < count - _end; i++) { + msgs[_begin + i] = msgs[_end + i]; + } + + // update the count. + count -= _end - _begin; +} + +void SrsFastVector::push_back(SrsSharedPtrMessage* msg) +{ + // increase vector. + if (count >= nb_msgs) { + int size = nb_msgs * 2; + SrsSharedPtrMessage** buf = new SrsSharedPtrMessage*[size]; + for (int i = 0; i < nb_msgs; i++) { + buf[i] = msgs[i]; + } + srs_warn("fast vector incrase %d=>%d", nb_msgs, size); + + // use new array. + srs_freep(msgs); + msgs = buf; + nb_msgs = size; + } + + msgs[count++] = msg; +} + +void SrsFastVector::free() +{ + for (int i = 0; i < count; i++) { + SrsSharedPtrMessage* msg = msgs[i]; + srs_freep(msg); + } + count = 0; +} +#endif + SrsMessageQueue::SrsMessageQueue() { queue_size_ms = 0; @@ -251,7 +338,7 @@ void SrsMessageQueue::shrink() // for when we shrinked, the first is the iframe, // we will directly remove the gop next time. for (int i = 1; i < (int)msgs.size(); i++) { - SrsSharedPtrMessage* msg = msgs[i]; + SrsSharedPtrMessage* msg = msgs.at(i); if (msg->is_video()) { if (SrsFlvCodec::video_is_keyframe(msg->payload, msg->size)) { @@ -281,7 +368,7 @@ void SrsMessageQueue::shrink() // remove the first gop from the front for (int i = 0; i < iframe_index; i++) { - SrsSharedPtrMessage* msg = msgs[i]; + SrsSharedPtrMessage* msg = msgs.at(i); srs_freep(msg); } msgs.erase(msgs.begin(), msgs.begin() + iframe_index); @@ -289,12 +376,16 @@ void SrsMessageQueue::shrink() void SrsMessageQueue::clear() { +#ifndef SRS_PERF_QUEUE_FAST_VECTOR std::vector::iterator it; for (it = msgs.begin(); it != msgs.end(); ++it) { SrsSharedPtrMessage* msg = *it; srs_freep(msg); } +#else + msgs.free(); +#endif msgs.clear(); diff --git a/trunk/src/app/srs_app_source.hpp b/trunk/src/app/srs_app_source.hpp index d1746c0ff..533e9b5a1 100644 --- a/trunk/src/app/srs_app_source.hpp +++ b/trunk/src/app/srs_app_source.hpp @@ -102,6 +102,34 @@ public: virtual int get_time(); }; +#ifdef SRS_PERF_QUEUE_FAST_VECTOR +/** +* to alloc and increase fixed space, +* fast remove and insert for msgs sender. +* @see https://github.com/winlinvip/simple-rtmp-server/issues/251 +*/ +class SrsFastVector +{ +private: + SrsSharedPtrMessage** msgs; + int nb_msgs; + int count; +public: + SrsFastVector(); + virtual ~SrsFastVector(); +public: + virtual int size(); + virtual int begin(); + virtual int end(); + virtual SrsSharedPtrMessage** data(); + virtual SrsSharedPtrMessage* at(int index); + virtual void clear(); + virtual void erase(int _begin, int _end); + virtual void push_back(SrsSharedPtrMessage* msg); + virtual void free(); +}; +#endif + /** * the message queue for the consumer(client), forwarder. * we limit the size in seconds, drop old messages(the whole gop) if full. @@ -112,7 +140,11 @@ private: int64_t av_start_time; int64_t av_end_time; int queue_size_ms; +#ifdef SRS_PERF_QUEUE_FAST_VECTOR + SrsFastVector msgs; +#else std::vector msgs; +#endif public: SrsMessageQueue(); virtual ~SrsMessageQueue(); diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 9c6a2092d..26c3c1f7c 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR 2 #define VERSION_MINOR 0 -#define VERSION_REVISION 65 +#define VERSION_REVISION 66 // server info. #define RTMP_SIG_SRS_KEY "SRS" #define RTMP_SIG_SRS_ROLE "origin/edge server" diff --git a/trunk/src/core/srs_core_performance.hpp b/trunk/src/core/srs_core_performance.hpp index ffb4788d5..e37e0cee0 100644 --- a/trunk/src/core/srs_core_performance.hpp +++ b/trunk/src/core/srs_core_performance.hpp @@ -135,6 +135,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #undef SRS_PERF_QUEUE_FAST_CACHE /** +* whether enable the fast vector for qeueue. +* @see https://github.com/winlinvip/simple-rtmp-server/issues/251 +*/ +#undef SRS_PERF_QUEUE_FAST_VECTOR +/** * whether use cond wait to send messages. * @remark this improve performance for large connectios. * @see https://github.com/winlinvip/simple-rtmp-server/issues/251