改进Threadglog并增加多线程写测试
来源:互联网 发布:北京北大青鸟网络学校 编辑:程序博客网 时间:2024/05/29 09:48
写了个objectpool,很简单,就是个线程安全的队列。
#pragma once#include <iostream>#include <concurrent_vector.h>#include <concurrent_queue.h>#include <algorithm>template <typename T>class ObjectPool{public:ObjectPool(size_t chunk_size = kdefault_size, size_t chunk_num = 32): chunk_size_ (chunk_size), chunk_num_(chunk_num){allocate_chunk();}~ObjectPool(){std::for_each(all_objects_.begin(), all_objects_.end(), ObjectPool<T>::array_delete_object);}T* acquire_object(){if (free_list_.empty()){allocate_chunk();}T *obj = nullptr;free_list_.try_pop(obj);return obj;}void release_object(T* obj){if (NULL != obj)free_list_.push(obj);}protected:void allocate_chunk(){printf("%s\n", __FUNCTION__);for (int i = 0; i < chunk_num_; ++i){T* new_objects = new T(chunk_size_);all_objects_.push_back(new_objects);free_list_.push(new_objects);}}static void array_delete_object(T* obj){delete obj;}private:Concurrency::concurrent_queue<T*> free_list_;Concurrency::concurrent_vector<T*> all_objects_;int chunk_size_; //对象池中预分配对象个数int chunk_num_;static const size_t kdefault_size = 100; //默认对象池大小ObjectPool(const ObjectPool<T>& src);ObjectPool<T>& operator=(const ObjectPool<T>& rhs);};
主线程开启业务线程来写:
#define GLOG_NO_ABBREVIATED_SEVERITIES#include <windows.h>#include <glog/logging.h>#include "ThreadLog.h"#include <random>#include <chrono>#include <thread>typedef std::chrono::high_resolution_clock::time_point time_point;typedef std::chrono::duration<int64_t,std::ratio<1, 1000> > millisecond;typedef std::chrono::duration<int64_t,std::ratio<1, 1000000> > microsecond;void writeLog(void* para){std::random_device rd;int lognum = *(int*)para;for (int i = 0; i < lognum; ++i){LOG(INFO) << "how are " << rd() << " cookies";}}using namespace google;int main(int argc, char* argv[]) {auto start_time = std::chrono::high_resolution_clock::now();google::InitGoogleLogging("test/testsss");google::base::Logger* mylogger = new google::ThreadLog;SetLogger(google::GLOG_INFO, mylogger);google::SetLogDestination(google::GLOG_INFO, "../Debug/Debug"); int num_cookies = 0;int lognum = 1000000;int threadNum = 1;std::thread* threads = new std::thread[threadNum];for (int i = 0; i < threadNum; ++i){threads[i] = std::thread(writeLog, &lognum);}for (int i = 0; i < threadNum; ++i){threads[i].join();}auto application_end_time = std::chrono::high_resolution_clock::now();auto application_time_us = std::chrono::duration_cast<microsecond>(application_end_time - start_time).count()/1000;LOG(INFO) << "threadglog total use " << application_time_us << "s";google::ShutdownGoogleLogging();}
单线程投递写日志一百万条用了13046s;
10个线程每个线程写一万条use 7808s;
额,忘记了,用的机子是thinkpad E431,四核 4G内存,显然还是发回来多核的优势。
0 0
- 改进Threadglog并增加多线程写测试
- AWS增加Redis并对RDS进行若干改进
- Junit单元测试写多线程测试
- nginx 增加 spdy 支持并测试
- Nginx 增加 SPDY 支持并测试
- 多线程写图像文件的一点小测试
- LGame性能改进,并增加TMX地图支持(0.2.96版)
- Linux驱动开发之四-----LED改进测试(增加自动创建设备节点)
- 改进JPopupMenuButton增加记忆功能
- 多线程 Pipeline 的改进
- JAVA写的多线程下载程序,并具有断点续传功能
- JAVA写的多线程下载程序,并具有断点续传功能
- 多线程写图像文件的一点小测试(Boost + Gual)
- 写一个多线程做压力测试的例子
- 软件测试过程改进
- 改进Miller_rabin素数测试
- 测试程序 改进程序
- 如何写自己的lib文件并测试
- 技术剖析中国菜刀原理
- void 及void *指针解析
- grep命令学习整理
- _ftol2 _ftol2_sse
- HTTP协议的状态码
- 改进Threadglog并增加多线程写测试
- poj3264Balanced Lineup
- null
- Java——坦克大战(2)
- Eclipse快捷键大全
- C++ Primer 第八章 标准IO库
- cookie与session以及他们的常规用途——web开发必须熟知的知识
- android 虚拟设备(AVD)的创建和使用
- 【最小生成树】