茴香豆的几种吃法之内存池队列使用方式

对比new delete 与使用容器管理内存队列release_x64模式:

new-delete 2000次:              0.2124 ms
std::deque 出入队2000次: 0.0699 ms

libuv 出入队2000次:           0.053 ms

std::mutex mutex1;
std::deque bufs;
void testMem()
{Timer timer;timer.start();for (int i = 0; i < 2000; i++){char * buf = new char[2048];delete buf;}double t = timer.stop_delta();cout << t << endl;/const char *p = "hello";timer.start();for (int i = 0; i < 2000; i++){{std::lock_guard lock(mutex1);bufs.push_back(p);}{std::lock_guard lock(mutex1);bufs.pop_back();}}t = timer.stop_delta();cout << t << endl;
}

libuv模式:

#pragma once
#include 
#include 
#include "../include/queue.h"typedef struct mem_s
{mem_s(){buffer = new char[2048];nCap = 2048;nSize = 0;}~mem_s(){delete buffer;}void reset() { nSize = 0; }char *buffer;size_t nSize;size_t nCap;QUEUE node;
}mem_t;class BufferQue
{
public:BufferQue(){QUEUE_INIT(&head);uv_mutex_init(&mutexQue);}~BufferQue(){uv_mutex_destroy(&mutexQue);}mem_t * getBuffer(){//std::lock_guard guard(mutexQue);QUEUE * p;mem_t * ret;uv_mutex_lock(&mutexQue);p = QUEUE_HEAD(&head);if (p != &head){QUEUE_REMOVE(p);ret = QUEUE_DATA(p, mem_t, node);assert(ret != nullptr);ret->reset();}else{ret = new mem_t();}uv_mutex_unlock(&mutexQue);return ret;}bool putBuffer(mem_t * buf){//std::lock_guard guard(mutexQue);if (buf == nullptr)return false;uv_mutex_lock(&mutexQue);QUEUE_INSERT_TAIL(&head, &(buf->node));uv_mutex_unlock(&mutexQue);return true;}private:QUEUE head;uv_mutex_t mutexQue;//std::mutex mutexQue;};void testBufferQue()
{BufferQue bufPool;mem_t * p = bufPool.getBuffer();bufPool.putBuffer(p);Timer timer;timer.start();for (int i = 0; i < 2000; i++){mem_t * p = bufPool.getBuffer();bufPool.putBuffer(p);}double t = timer.stop_delta();cout << t << endl;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部