为什么std::sort
的lambda函数执行速度较慢?没有lambda函数的情况下是否使用内部比较函数?
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <chrono>
using steady_clock = std::chrono::steady_clock;
using time_point = steady_clock::time_point;
using milli = std::chrono::milliseconds;
int main()
{
const int N = 1e7;
std::random_device rnd_device;
std::mt19937 mersenne_engine {rnd_device()};
std::uniform_int_distribution<int> dist {1, N};
auto gen = [&dist, &mersenne_engine](){
return dist(mersenne_engine);
};
std::vector<int> v1(N);
generate(v1.begin(), v1.end(), gen);
std::vector<int> v2;
v2 = v1;
time_point begin, end;
// without lambda
begin = steady_clock::now();
std::sort(v1.begin(), v1.end());
end = steady_clock::now();
std::cout << "elapsed v1 = " << std::chrono::duration_cast<milli>(end - begin).count() <<std::endl;
// with lambda
begin = steady_clock::now();
std::sort(v2.begin(), v2.end(), [](int left, int right){return left < right;});
end = steady_clock::now();
std::cout << "elapsed v2 = " << std::chrono::duration_cast<milli>(end - begin).count() <<std::endl;
return 0;
}
答案 0 :(得分:1)
没有lambda函数的情况下是否使用内部比较函数?
否,不使用内部函数进行比较。它直接使用operator <
。
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
使用运算符<。比较元素。
尽管好的编译器可以内联该函数,但不能保证,特别是在未打开优化的情况下。尽管没有功能的std::sort
版本始终使用operator <
,即此处不涉及任何函数调用(显然假设该类型不是带有重载operator <
的用户定义类型)。>