您的位置:首页 > 其它

VC2010 STL 与 STLport 性能比较

2011-09-06 11:10 225 查看
今天对 VC2010 的 STL 和 STLport 的性能进行了一下简单的比较,测试结果如下:

测试容器DEBUGRELEASE
STLportVC2010STLportVC2010
启用 _STLP_DEBUG 参数不启用 _STLP_DEBUG 参数
vector6.7802.5800.8673.4802.547
list4.7501.0871.5971.7301.917
deque6.4332.3301.7402.6602.170
set4.9801.1370.6031.9201.903
map9.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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: