为什么lambda减慢排序速度

时间:2018-08-16 10:34:46

标签: c++ lambda

为什么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;
}

1 个答案:

答案 0 :(得分:1)

  

没有lambda函数的情况下是否使用内部比较函数?

否,不使用内部函数进行比较。它直接使用operator <

来自cppreference.com

template< class RandomIt >
void sort( RandomIt first, RandomIt last );
  

使用运算符<。比较元素。

尽管好的编译器可以内联该函数,但不能保证,特别是在未打开优化的情况下。尽管没有功能的std::sort版本始终使用operator <,即此处不涉及任何函数调用(显然假设该类型不是带有重载operator <的用户定义类型)。