VC2010 STL 与 STLport 性能比较

来源:互联网 发布:网络心理误区 编辑:程序博客网 时间:2024/06/07 23:43

今天对 VC2010 的 STL 和 STLport 的性能进行了一下简单的比较,测试结果如下:

测试容器DEBUGRELEASESTLportVC2010STLportVC2010启用 _STLP_DEBUG 参数不启用 _STLP_DEBUG 参数vector6.7802.5800.8673.4802.547list4.7501.0871.5971.7301.917deque6.4332.3301.7402.6602.170set4.9801.1370.6031.9201.903map9.2802.1931.0203.8133.847总用时32.2179.3235.85013.60712.390

注:每个测试执行 3 次取平均值;由于 DEBUG 版和 RELEASE 版性能差异较大,故使用了不同的测试参数,具体看下面的代码;_STLP_DEBUG 参数是 STLport 特有的参数,主要是启用 DEBUG 模式下的检查功能,所以性能是最低的。

从测试结果可以看出 VC2010 的性能比以前提高不少,基本和 STLport 差不多了,甚至更有过之。估计主要得益于 C++0x 的右值引用新特性,具体可以看这里。

由于测试比较简单,只是进行了容器的元素添加、排序、移除等简单操作(具体代码看下面),所以测试不一定很准确,只能作为一个简单的参考,不能作为专业的结论。如果发现有什么问题,欢迎与我交流。

另外,测试中使用了随机数也会影响测试结果,但是理论上只要测试的数量多的话,这个影响是可以忽略的。而且代码中没有使用 srand() 初始化随机数序列,所以测试中使用的随机数序列应该是一致的,所以影响应该也是可以忽略的。

测试环境如下:

Pentium Dual-Core CPU E5200 2.5GHz, 2GB 内存

Windows XP Professional Service Pack 3

测试代码如下:

vector:

void VectorTest::DoRun(){vector<string> v;v.reserve(TEST_CONTAINER_SIZE);for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){v.push_back(GetRandomString());}sort(v.begin(), v.end());for (size_t i = 0; i < TEST_CONTAINER_SIZE / 100; ++i){vector<string>::iterator it = v.begin() + rand() % v.size();v.erase(it);}}

list:

void ListTest::DoRun(){list<string> l;for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){l.push_back(GetRandomString());}l.sort();for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){string s = l.front();l.pop_front();}}

deque:

void DequeTest::DoRun(){deque<string> d;for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){d.push_back(GetRandomString());}sort(d.begin(), d.end());for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){string s = d.front();d.pop_front();}}

set:

void SetTest::DoRun(){typedef set<string> Set;Set s;for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){pair<Set::iterator, bool> p = s.insert(GetRandomString());}for (size_t i = 0; i < TEST_CONTAINER_SIZE / 10; ++i){Set::iterator it = s.lower_bound(GetRandomString());if (it != s.end()){s.erase(it);}}}

map:

void MapTest::DoRun(){typedef map<string, string> Map;Map m;for (size_t i = 0; i < TEST_CONTAINER_SIZE; ++i){pair<Map::iterator, bool> p = m.insert(make_pair(GetRandomString(), GetRandomString()));}for (size_t i = 0; i < TEST_CONTAINER_SIZE / 10; ++i){Map::iterator it = m.lower_bound(GetRandomString());if (it != m.end()){m.erase(it);}}}

其中 GetRandomString() 如下:

string TestBase::GetRandomString(){string randomString(rand() % TEST_STRING_MAX_SIZE, '\0');generate(randomString.begin(), randomString.end(), rand);return randomString;}

测试参数如下:

DEBUG:

const size_t TEST_CONTAINER_SIZE = 10000;const size_t TEST_STRING_MAX_SIZE = 1024;

RELEASE:

const size_t TEST_CONTAINER_SIZE = 100000;// DEBUG 版的 10 倍const size_t TEST_STRING_MAX_SIZE = 1024;