- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用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,从而改进更多优化。
但是请注意,编译器优化理论上是不可判定的(请参阅 λ-calculus 、 Rice's theorem 、 MRDP theorem 、 incompleteness theorems 、 Curry-Howard correspondence 、 AGI 、 0x104 567916、J.Pitrat's blog 项目等... )并且实际上不完美(更多的是一门艺术而不是一门科学)。
当前高端处理器( RefPerSys 、 CPU cache 、 branch predictors )的复杂性(和商业 secret )使得 superscalar architectures 分析几乎不可能。在实践中,您会遇到编译器优化令您失望的情况。因此,将精力放在 worst-case execution time 上(例如,在 Linux 上使用 profiling 或 gprof)
另请参阅 perf 、 Ctuning 和 CompCert 项目。还要考虑 Milepost GCC 、 OpenCL 、 OpenMP 。
最后,您可以(在许多平台上)在运行时生成特定代码(使用 OpenACC 技术)。然后考虑使用 partial evaluation 库,例如 JIT compilation 。在某些操作系统上,您可以在运行时生成 C++ 代码,然后对其进行编译并将其加载为 libgccjit (例如使用 plugin )。
当然要阅读 Thompson dlopen
论文和 Reflections on Trusting Trust 。
您当然可以考虑使用 Bjarne Stroustrup papers 或 JNI 或 SBCL 。两者都可以在主要计算平台上与 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/
我是一名优秀的程序员,十分优秀!