我在一些代码中使用了map
来存储有序数据。我发现对于巨大的map
,销毁可能需要一段时间。在这段代码中,我将map
替换为vector<pair>
,降低了处理时间10000倍...
最后,我很惊讶,决定比较map
和排序后的vector
或pair
的性能。
我很惊讶,因为我找不到map
比随机填充并稍后排序的排序vector
更快的情况...必须存在某些情况下map
更快...否则提供此类有何意义?
以下是我的测试:
第一项测试,比较map
填充和销毁与vector
填充、排序(因为我需要一个排序容器)和销毁:
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <map>
#include <vector>
#include <algorithm>
int main(void)
{
clock_t tStart = clock();
{
std::map<float,int> myMap;
for ( int i = 0; i != 10000000; ++i )
{
myMap[ ((float)std::rand()) / RAND_MAX ] = i;
}
}
std::cout << "Time taken by map: " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
tStart = clock();
{
std::vector< std::pair<float,int> > myVect;
for ( int i = 0; i != 10000000; ++i )
{
myVect.push_back( std::make_pair( ((float)std::rand()) / RAND_MAX, i ) );
}
// sort the vector, as we want a sorted container:
std::sort( myVect.begin(), myVect.end() );
}
std::cout << "Time taken by vect: " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
return 0;
}
使用g++ main.cpp -O3 -o main
编译,得到以下结果:
Time taken by map: 21.7142
Time taken by vect: 7.94725
map
比vector
慢3倍...
然后我说:"好的,用vector
填充和排序更快,但用map
进行搜索会更快"....所以我进行了测试:
#include <iostream>
#include <time.h>
#include <cstdlib>
#include <map>
#include <vector>
#include <algorithm>
int main(void)
{
clock_t tStart = clock();
{
std::map<float,int> myMap;
float middle = 0;
float last;
for ( int i = 0; i != 10000000; ++i )
{
last = ((float)std::rand()) / RAND_MAX;
myMap[ last ] = i;
if ( i == 5000000 )
middle = last; // element we will later search
}
std::cout << "Map created after " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
float sum = 0;
for ( int i = 0; i != 10; ++i )
sum += myMap[ last ]; // search it
std::cout << "Sum is " << sum << std::endl;
}
std::cout << "Time taken by map: " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
tStart = clock();
{
std::vector< std::pair<float,int> > myVect;
std::pair<float,int> middle;
std::pair<float,int> last;
for ( int i = 0; i != 10000000; ++i )
{
last = std::make_pair( ((float)std::rand()) / RAND_MAX, i );
myVect.push_back( last );
if ( i == 5000000 )
middle = last; // element we will later search
}
std::sort( myVect.begin(), myVect.end() );
std::cout << "Vector created after " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
float sum = 0;
for ( int i = 0; i != 10; ++i )
sum += (std::find( myVect.begin(), myVect.end(), last ))->second; // search it
std::cout << "Sum is " << sum << std::endl;
}
std::cout << "Time taken by vect: " << ((double)(clock() - tStart)/CLOCKS_PER_SEC) << std::endl;
return 0;
}
使用g++ main.cpp -O3 -o main
进行编译,得到以下结果:
Map created after 19.5357
Sum is 1e+08
Time taken by map: 21.41
Vector created after 7.96388
Sum is 1e+08
Time taken by vect: 8.31741
即使是搜索,使用vector
显然也更快(使用map
进行10次搜索几乎需要2秒,而使用vector
仅需半秒钟)...
所以:
- 我有遗漏吗?
- 我的测试不正确/准确吗?
map
只是一个要避免的类吗,还是真的存在map
可以提供良好性能的情况?
map
最终变得更快了。 - jpo38