gpt4 book ai didi

c++ - 为什么将影响 lambda 的代码编译为 std::function 如此缓慢,尤其是使用 Clang 时?

转载 作者:可可西里 更新时间:2023-11-01 18:39:50 25 4
gpt4 key购买 nike

我发现相对少量代码的编译时间,将 lambda 函数转换为 std::function<>值,可以非常高,尤其是使用 Clang 编译器时。

考虑以下创建 100 个 lambda 函数的虚拟代码:

#if MODE==1
#include <functional>
using LambdaType = std::function<int()>;
#elif MODE==2
using LambdaType = int(*)();
#elif MODE==3
#include "function.h" // https://github.com/skarupke/std_function
using LambdaType = func::function<int()>;
#endif

static int total=0;

void add(LambdaType lambda)
{
total += lambda();
}

int main(int argc, const char* argv[])
{
add([]{ return 1; });
add([]{ return 2; });
add([]{ return 3; });
// 96 more such lines...
add([]{ return 100; });

return total == 5050 ? 0 : 1;
}

取决于MODE预处理器宏,该代码可以选择以下三种方式将 lambda 函数传递给 add功能:

  1. std::function<>模板类
  2. 一个指向函数的简单 C 指针(这里可能是因为没有捕获)
  3. 快速替换 std::function作者:Malte Skarupke ( https://probablydance.com/2013/01/13/a-faster-implementation-of-stdfunction/ )

无论何种模式,程序总是以常规 0 退出错误代码。但是现在看看 Clang 的编译时间:

$ time clang++ -c -std=c++11 -DMODE=1 lambdas.cpp 
real 0m8.162s
user 0m7.828s
sys 0m0.318s

$ time clang++ -c -std=c++11 -DMODE=2 lambdas.cpp
real 0m0.109s
user 0m0.056s
sys 0m0.046s

$ time clang++ -c -std=c++11 -DMODE=3 lambdas.cpp
real 0m0.870s
user 0m0.814s
sys 0m0.051s

$ clang++ --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

哇哦。 std::function 之间有 80 倍的编译时间差异和指向功能模式的指针! std::function 之间甚至相差 10 倍及其替代品。

怎么可能呢?是否存在特定于 Clang 的性能问题,还是由于 std::function 的固有复杂性所致?要求?

我尝试使用 GCC 5.4 和 Visual Studio 2015 编译相同的代码。编译时间也有很大差异,但没有那么大。

海湾合作委员会:

$ time g++ -c -std=c++11 -DMODE=1 lambdas.cpp 
real 0m1.179s
user 0m1.080s
sys 0m0.092s

$ time g++ -c -std=c++11 -DMODE=2 lambdas.cpp
real 0m0.136s
user 0m0.120s
sys 0m0.012s

$ time g++ -c -std=c++11 -DMODE=3 lambdas.cpp
real 0m1.994s
user 0m1.792s
sys 0m0.196s

Visual Studio :

C:\>ptime cl /c /DMODE=1 /EHsc /nologo lambdas.cpp
Execution time: 2.411 s

C:\>ptime cl /c /DMODE=2 /EHsc /nologo lambdas.cpp
Execution time: 0.270 s

C:\>ptime cl /c /DMODE=3 /EHsc /nologo lambdas.cpp
Execution time: 1.122 s

我现在正在考虑使用 Malte Skarupke 的实现,以提高运行时性能和大大增强编译时间。

最佳答案

使用 --save-temps 选项查看编译器在每种情况下必须处理的内容。在我的 clang 6.0.1 机器上,MODE=1 生成了一个 575K 的预处理文件,因为包含了大量的标准库头文件。MODE=1 生成一个 416 byte 文件,小 1000 倍。生成的程序集也相差 10 倍。

关于c++ - 为什么将影响 lambda 的代码编译为 std::function 如此缓慢,尤其是使用 Clang 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52499122/

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