gpt4 book ai didi

c++ - 传递给 std::sort 时,全局函数比仿函数或 lambda 慢

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:54 24 4
gpt4 key购买 nike

我做了一个小测试来检查全局函数/仿函数/lambda 作为 std::sort 函数的比较器参数的性能。 Functor 和 lambda 具有相同的性能。我惊讶地发现,看起来是最简单回调的全局函数却慢得多。

#include <stdafx.h>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;

const int vector_size = 100000;

bool CompareFunction(const string& s1, const string& s2)
{
return s1[0] < s2[0]; // I know that is crashes on empty string, but this is not the point here
}

struct CompareFunctor
{
bool operator() (const string& s1, const string& s2)
{
return s1[0] < s2[0];
}
} compareFunctor;

int main()
{
srand ((unsigned int)time(NULL));
vector<string> v(vector_size);

for(size_t i = 0; i < vector_size; ++i)
{
ostringstream s;
s << rand();
v[i] = s.str().c_str();
}

LARGE_INTEGER freq;
LARGE_INTEGER beginTime, endTime;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&beginTime);

// One of three following lines should be uncommented
sort(v.begin(), v.end(), CompareFunction);
// sort(v.begin(), v.end(), compareFunctor);
// sort(v.begin(), v.end(), [](const string& s1, const string& s2){return s1[0] < s2[0];});

QueryPerformanceCounter(&endTime);
float f = (endTime.QuadPart - beginTime.QuadPart) * 1000.0f/freq.QuadPart; // time in ms
cout << f << endl;

return 0;
}

一些特定于 Windows 的代码用于精确的执行时间测量。环境:Windows 7,Visual C++ 2010。当然,Release configuration with default optimizations opened。执行时间:

Global function 2.6 - 3.6 ms   (???)
Functor - 1.7 - 2.4 ms
Lambda - 1.7 - 2.4 ms

那么,为什么全局函数比较慢? VC++ 编译器有问题,还是其他问题?

最佳答案

传递全局函数是最复杂的,而不是最简单的。

当你传入一个函数时,你实际上是在将一个指针传递给该函数,因此排序函数无法轻易地内联对该函数的调用,因为它在编译时不知道指针将指向什么。当然,它可能能够弄清楚通过函数指针的调用每次都调用相同的函数并将其全部内联,但这很难。

当您使用 lambda 或仿函数时,编译器在生成代码时确切地知道它需要调用哪个函数,因此很可能能够将其全部内联。

关于c++ - 传递给 std::sort 时,全局函数比仿函数或 lambda 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21425528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com