对比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<const char *> 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<Timer::ms>();
cout << t << endl;
/
const char *p = "hello";
timer.start();
for (int i = 0; i < 2000; i++)
{
{
std::lock_guard<std::mutex> lock(mutex1);
bufs.push_back(p);
}
{
std::lock_guard<std::mutex> lock(mutex1);
bufs.pop_back();
}
}
t = timer.stop_delta<Timer::ms>();
cout << t << endl;
}
libuv模式:
#pragma once
#include <uv.h>
#include <mutex>
#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<std::mutex> 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<std::mutex> 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<Timer::ms>();
cout << t << endl;
}