我估计这两种解决方案之间没有太大区别。
但就像所有与性能相关的查询一样,不要依赖互联网上的人告诉他们是相同的,或者一个比另一个更好,而是自己进行测量。有时,实现上的细微差别会对实际结果产生很大影响。
话虽如此, 的 实现std::pair
是一个具有两个成员的结构(或类),first
和second
,所以我很难想象这里有什么真正的区别 - 你只是用你自己的比较函数来实现你自己的对已经存在的对所做的相同的事情......无论是在类的内部函数中还是作为独立函数都不太可能产生太大的不同。
编辑:我做了以下“将代码混合在一起”:
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
const int size=100000000;
pair <int,int> clients1[size];
struct cl1{
int first,second;
};
cl1 clients2[size];
struct cl2{
int first,second;
bool operator<(const cl2 x) const {
return first < x.first;
}
};
cl2 clients3[size];
template<typename T>
void fill(T& t)
{
srand(471117); // Use same random number each time/
for(size_t i = 0; i < sizeof(t) / sizeof(t[0]); i++)
{
t[i].first = rand();
t[i].second = -t[i].first;
}
}
void func1()
{
sort(clients1,clients1+size);
}
bool cmp(cl1 x, cl1 y){
return x.first < y.first;
}
void func2()
{
sort(clients2,clients2+size,cmp);
}
void func3()
{
sort(clients3,clients3+size);
}
void benchmark(void (*f)(), const char *name)
{
cout << "running " << name << endl;
clock_t time = clock();
f();
time = clock() - time;
cout << "Time taken = " << (double)time / CLOCKS_PER_SEC << endl;
}
#define bm(x) benchmark(x, #x)
int main()
{
fill(clients1);
fill(clients2);
fill(clients3);
bm(func1);
bm(func2);
bm(func3);
}
结果如下:
running func1
Time taken = 10.39
running func2
Time taken = 14.09
running func3
Time taken = 10.06
我运行了 3 次基准测试,它们都在上述结果的 ~0.1 秒内。
Edit2:查看生成的代码,很明显“中间”函数需要更长的时间,因为比较是内联的pair
and struct cl2
,但不能内联struct cl1
- 所以每次比较都会产生一个函数调用,而不是函数内部的一些指令。这是一个很大的开销。