3

我尝试将Boost.Pool 分配器与 一起使用vector<wstring>,期望某种形式的性能增益超过普通分配vector<wstring>(我期待某种快速的结果,例如这些)。

但是,似乎使用 Boost.Pool 我实际上得到了更糟糕的结果,例如:

  • 对于 15,000 次迭代的计数,0 ms显示为普通分配vector<wstring>,而不是使用 Boost.Pool 的经过时间为 5900 毫秒;

  • 对于 5,000,000 次迭代的计数,使用默认分配器完成循环大约需要 1300 毫秒,而不是boost::pool_allocator需要很多时间(一分钟后我用Ctrl+打破了C)。

这是我编写的 C++ 代码基准测试:

//////////////////////////////////////////////////////////////////////////
// TestBoostPool.cpp
// Testing vector<wstring> with Boost.Pool
//////////////////////////////////////////////////////////////////////////


#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

// To avoid linking with Boost Thread library
#define BOOST_DISABLE_THREADS

#include <boost/pool/pool_alloc.hpp>
#include <boost/timer/timer.hpp>

using namespace std;

void Test()
{
  // Loop iteration count
  static const int count = 5*1000*1000;

  //
  // Testing ordinary vector<wstring>
  //
  cout << "Testing vector<wstring>" << endl;
  {
    boost::timer::auto_cpu_timer t;
    vector<wstring> vec;
    for (int i = 0; i < count; i++)
    {
      wstring s(L"I think therefore I am; just a simple test string.");
      vec.push_back(s);
    }
  }

  //
  // Testing vector<wstring> with Boost.Pool
  //
  cout << "Testing vector<wstring> with Boost.Pool" << endl;
  {
    boost::timer::auto_cpu_timer t;
    typedef basic_string<wchar_t, char_traits<wchar_t>, 
      boost::fast_pool_allocator<wchar_t>> PoolString;

    vector<PoolString> vec;
    for (int i = 0; i < count; i++)
    {
      PoolString s(L"I think therefore I am; just a simple test string.");
      vec.push_back(s);
    }

    // Release pool memory
    boost::singleton_pool<boost::fast_pool_allocator_tag, sizeof(wchar_t)>::release_memory();
  }

  cout << endl;
}


int main()
{
    const int exitOk = 0;
    const int exitError = 1;

    try
    {
        Test();
    }
    catch(const exception & e)
    {
        cerr << "\n*** ERROR: " << e.what() << endl;
        return exitError;
    }

    return exitOk;
}

我在滥用 Boost.Pool 吗?我在这里想念什么?

(我使用 VS2010 SP1 和 Boost 1.49.0)

4

1 回答 1

11

仅供参考 Boost.Pool 不是为这种用途而设计或优化的——它是为许多固定大小的块而设计的,就像在列表(甚至是地图或集合)中发生的那样,它并不是真正为可变大小的快速性能而设计的块就像发生在字符串或向量中一样。

于 2012-05-05T11:25:14.920 回答