C++ 为什么lambda会减慢排序速度

C++ 为什么lambda会减慢排序速度,c++,lambda,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 =

为什么
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;
}
#包括
#包括
#包括
#包括
#包括
使用稳定时钟=标准::时钟::稳定时钟;
使用时间点=稳定时钟::时间点;
使用milli=std::chrono::毫秒;
int main()
{
常数int N=1e7;
std::随机_装置rnd_装置;
std::mt19937 mersenne_引擎{rnd_设备()};
std::均匀分布区{1,N};
自动生成=[&dist,&mersenne_引擎](){
返回区(mersenne_发动机);
};
std::向量v1(N);
生成(v1.begin(),v1.end(),gen);
std::向量v2;
v2=v1;
时间点开始、结束;
//没有lambda
开始=稳定的时钟::现在();
排序(v1.begin(),v1.end());
结束=稳定的时钟::现在();
标准::cout
没有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;
}
不,不使用内部函数进行比较。它直接使用
运算符
无效排序(先随机,后随机);

使用运算符比较元素编译选项/开关?哪些编译器和标志?OP可能忘记了包含优化。现在的编译器可以内联lambda函数。编译器是g++且没有标志。请确保启用了优化。没有优化且可能因此没有内联的clang将启用783/2205我那微不足道的MBA学位。启动发行版mod at-O2会导致779/779。你的问题应该包括工具链(包括版本)和编译时使用的任何开关。