VC2010 STL 与 STLport 性能比较
2011-09-06 11:10
225 查看
今天对 VC2010 的 STL 和 STLport 的性能进行了一下简单的比较,测试结果如下:
注:每个测试执行 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:
list:
deque:
set:
map:
其中 GetRandomString() 如下:
测试参数如下:
DEBUG:
RELEASE:
测试容器 | DEBUG | RELEASE | |||
STLport | VC2010 | STLport | VC2010 | ||
启用 _STLP_DEBUG 参数 | 不启用 _STLP_DEBUG 参数 | ||||
vector | 6.780 | 2.580 | 0.867 | 3.480 | 2.547 |
list | 4.750 | 1.087 | 1.597 | 1.730 | 1.917 |
deque | 6.433 | 2.330 | 1.740 | 2.660 | 2.170 |
set | 4.980 | 1.137 | 0.603 | 1.920 | 1.903 |
map | 9.280 | 2.193 | 1.020 | 3.813 | 3.847 |
总用时 | 32.217 | 9.323 | 5.850 | 13.607 | 12.390 |
从测试结果可以看出 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;
相关文章推荐
- STL各个容器性能详细比较
- VC++2010下编译STLport,Boost
- STL容器 vector,list,deque 性能比较
- STL各个容器性能比较
- VC++2010下编译STLport,Boost
- VC++2010下编译STLport,Boost
- VC++2010下编译STLport,Boost
- VC++2010下编译STLport,Boost
- 在vc 2010设置_STL70_
- VC++2010下编译STLport,Boost
- VC 2010 非标准STL容器hash map代码分析
- VC++2010下编译STLport,Boost
- 性能特性测试系列1——STL容器,QT容器性能相关比较和总结
- 两篇关于stl容器性能比较的文章
- 2010新版STL修订内容(VC2010)
- Windows 7 64bit和Visual Studio 2010下的64位与32位程序配置,dll使用,与性能初步比较
- VC++2010下编译STLport,Boost
- STL容器 vector,list,deque 性能比较
- 2010新版STL修订内容(VC2010)
- VC++2010下编译STLport,Boost