san*_*ank 5 c++ memory-management memory-pool boost-pool
我为MyOrder类编写了自定义运算符new和operator delete.我使用boost :: singleton pool分配内存.这是测试性能的程序,
#include <boost/pool/singleton_pool.hpp>
#include <boost/progress.hpp>
#include <iostream>
#include <new>
#include <vector>
class MyOrder{
std::vector<int> v1_;
std::vector<double> v2_;
std::string s1_;
std::string s2_;
public:
MyOrder(std::string s1, std::string s2): s1_(s1), s2_(s2) {}
~MyOrder(){}
static void * operator new(size_t size);
static void operator delete(void * rawMemory) throw();
};
struct MyOrderTag{};
typedef boost::singleton_pool<MyOrderTag, sizeof(MyOrder)> MyOrderPool;
void* MyOrder:: operator new(size_t size)
{
if (size != sizeof(MyOrder))
return ::operator new(size);
while(true){
void * ptr = MyOrderPool::malloc();
if (ptr != NULL) return ptr;
std::new_handler globalNewHandler = std::set_new_handler(0);
std::set_new_handler(globalNewHandler);
if(globalNewHandler) globalNewHandler();
else throw std::bad_alloc();
}
}
void MyOrder::operator delete(void * rawMemory) throw()
{
if(rawMemory == 0) return;
MyOrderPool::free(rawMemory);
}
int main()
{
MyOrder* mo = NULL;
std::vector<MyOrder*> v;
v.reserve(100000);
boost::progress_timer howlong;
for(int i = 0; i< 100000; ++i)
{
mo = new MyOrder("Sanket", "Sharma");
v.push_back(mo);
}
for (std::vector<MyOrder*>::const_iterator it = v.begin(); it != v.end(); ++it)
{
delete *it;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用-O2标志编译了上述程序,并在我的Macbook上运行了2.26 GHz Intel Core 2 Duo,耗时0.16秒.然后我评论了我声明的行并定义了自定义运算符new和operator delete,使用-O2标志重新编译并在同一台机器上运行花了0.13秒.
使用singleton_pool为相同大小的对象分配和释放内存应加快速度.为什么它变慢?或者是创建池的开销是否会使这个小程序中获得的性能优势无效?
更新:
我用int和double替换了两个std :: string变量,这次在3.0 GHZ AMD Phenom(tm)II X4 945处理器上运行两个程序,每次迭代100000000(即1000次)迭代.使用自定义内存分配的一个需要3.2秒,而使用默认内存分配的那个需要8.26秒.所以这次自定义内存分配获胜.
我认为你的数字毫无意义.如果您只检查了一次运行时,并且您发现0.13vs 0.16秒比完全没有意义,并且由开销支配.
您必须运行要测试数千次的代码段,然后比较数据以排除开销.
不是真的,0.03你的流程可以很容易地解释出秒差异等等.
| 归档时间: |
|
| 查看次数: |
2007 次 |
| 最近记录: |