【问题标题】:Efficiency of std::bind vs lambdastd::bind 与 lambda 的效率
【发布时间】:2018-03-12 23:59:52
【问题描述】:

我进行了一番搜索,发现了许多使用std::bind 代替 lambda 的示例和讨论,但我遇到的迫切问题是,其中一个是否有任何性能优势。我将描述我的用例:

我已经实现了一个通用的A*,我将后继、启发式距离和移动成本函数传递给它。

这是我的启发式函数的一个示例,可以用于搜索(两种形式):

std::function<float(const Location*, const Location*)> hdist = std::bind(&TerrainMap::straightLineDist, this, std::placeholders::_1, std::placeholders::_2);

std::function<float(const Location*, const Location*)> hdist2 = [this](const Location* a, const Location* b){
    return straightLineDist(a,b);
};

这些方法的性能有什么不同吗?我意识到差异可能可以忽略不计,但我很好奇想知道。

【问题讨论】:

  • 个人资料确定。
  • 或者查看assembler code。我无法正确阅读汇编程序,但我可以看到绑定版本有很多。
  • 在这两种情况下,您可能都应该使用auto。当您分配给 std::function 时,lambda 的最大优势(编译器知道确切的类型并且可以更积极地优化)就失去了。
  • 如果不知道确切的编译器品牌和版本,就无法回答这个问题,是的,检查汇编和分析是两个通常有用的工具。但是,如果任何bind 表达式确实比直接等效的 lambda 表现得更好,那将证明编译器错过了优化 lambda 的机会。

标签: c++ performance c++11 lambda stdbind


【解决方案1】:

这些方法的性能有什么不同吗?

也许,也许不是;正如评论者所建议的那样 - 要检查的配置文件,或查看您获得的汇编代码(例如,使用 GodBolt Compiler Explorer)。但是您问错了问题,主要原因有两个:

  1. 您可能不应该在对性能至关重要的代码部分传递 lambda 或 bind() 结果。
  2. 您应该绝对避免在代码的性能关键区域中通过函数指针或std::function 变量调用任意函数(除非编译器可以对其进行去虚拟化和内联)。

还有一个原因:

  1. Lambdas(和std::bind()'s)是可用的,有用的,没有被包装在std::function中;此包装器有其自身的性能损失,因此您只会比较使用这些构造的一种方式。

底线建议:只需使用 Lambda。它们更干净,更容易理解,编译成本更低,语法更灵活。所以不要担心,要开心:-)。在性能关键代码中,要么使用没有std::function 的 Lambda,要么不使用两者中的任何一个。

【讨论】:

  • 感谢您的洞察力。就我而言,我传递函数指针以使我的 A* 更通用 template &lt;typename S, typename D&gt; QLinkedList&lt;S&gt; astar(std::function&lt;QLinkedList&lt;S&gt;(S)&gt; getSuccessors, std::function&lt;D(S,S)&gt; gdist, std::function&lt;D(S)&gt; hdist, S start) {
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多