gpt4 book ai didi

c++ - 如果我使用 lambda 而不是 If block ,是否会有性能损失?

转载 作者:行者123 更新时间:2023-12-01 22:05:43 24 4
gpt4 key购买 nike

我正在使用Dear ImGui在 OpenGL 程序中以即时模式绘制我的 UI。

要创建选项卡,您通常会执行以下操作:

if (ImGui::BeginTabItem("Some Tab")) {
// Stuff
ImGui::EndTabItem();
}

我来自 Kotlin,在那里您通常使用如下结构:

something("bla bla bla") { x ->
// whatever
} // this is a Kotlin lambda btw

所以我写了一个简单的包装器,来包装调用而不是编写 if 和 end 调用,以避免意外省略 end 调用:

inline void tab(const char* label, std::function<void()> fn)
{
if (ImGui::BeginTabItem(label)) {
fn();
ImGui::EndTabItem();
}
}

它将第一个片段替换为:

ui::tab("Some other tab", []{
// More UI...
});

问题是,编译器会发出类似的代码吗?或者会对性能产生很大影响?

我担心,如果编译器在每次绘制 UI 时都放置一个新的可调用结构,则会出现问题。

另外,我正在捕获 this 指针,以便在内部使用。

if (ImGui::BeginTabItem("Some Tab")) {
// Stuff
ImGui::EndTabItem();
}

// -- VS -- //

ui::tab("Some other tab", [this]{
// More UI...
});

最佳答案

Is there preformance penalty if I use lambda instead of an If block?

这取决于您的编译器和 optimization 标志。

通过将现代 GCC 调用为 gcc -Wall -O3 -mtune=native ,您会对它能够执行的优化感到惊讶,包括 inline expansions 。您甚至可能对链接时间优化和整个程序优化感兴趣(例如使用 gcc -O3 -flto -fwhole-program 编译和链接 ....)。了解 GCC optimization flags

例如,请参阅 this draft 报告,该报告由 CHARIOT H2020 项目资助。

当然,细节决定成败

您可以使用 plugin 来扩展 GCC,从而改进更多优化。

但是请注意,编译器优化理论上是不可判定的(请参阅 λ-calculusRice's theoremMRDP theoremincompleteness theoremsCurry-Howard correspondenceAGI 、 0x104 567916、J.Pitrat's blog 项目等... )并且实际上不完美(更多的是一门艺术而不是一门科学)。

当前高端处理器( RefPerSysCPU cachebranch predictors )的复杂性(和商业 secret )使得 superscalar architectures 分析几乎不可能。在实践中,您会遇到编译器优化令您失望的情况。因此,将精力放在 worst-case execution time 上(例如,在 Linux 上使用 profilinggprof)

另请参阅 perfCtuningCompCert 项目。还要考虑 Milepost GCCOpenCLOpenMP

最后,您可以(在许多平台上)在运行时生成特定代码(使用 OpenACC 技术)。然后考虑使用 partial evaluation 库,例如 JIT compilation 。在某些操作系统上,您可以在运行时生成 C++ 代码,然后对其进行编译并将其加载为 libgccjit (例如使用 plugin )。

当然要阅读 Thompson dlopen 论文和 Reflections on Trusting Trust

您当然可以考虑使用 Bjarne Stroustrup papersJNISBCL 。两者都可以在主要计算平台上与 C++ 混合,并且实际上有利于运行时代码生成,因此可以提高执行时间。

您正在编码:

inline void tab(const char* label, std::function<void()> fn)

(如果 fn 可能间接地是 throw - 出现一些异常,那么您的代码不会执行您想要的操作)我建议改为

 inline void tab(const char* label, const std::function<void()>& fn)

关于c++ - 如果我使用 lambda 而不是 If block ,是否会有性能损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61440353/

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