什么更快 - if语句或函数调用?

时间:2010-08-08 17:38:59

标签: c# if-statement iequalitycomparer function-call

我正在写一个有趣的节目,每次演出对我来说都是非常痛苦的。 所以我想知道什么是更好的 - 制作一个额外的“if”语句来减少一些函数调用,或者避免那些“如果”adn获得更多的函数调用。该函数是虚方法,它覆盖IEqualityComparer的方法Equals,它所做的只是比较2个文件的大小和散列。 if语句比较这两个文件的大小。我认为你明白了这一逻辑。 你可以看到我正在用C#编写这个程序。所以也许任何人都可以回答我,因为这不是我第一次想知道该选择什么。感谢

9 个答案:

答案 0 :(得分:8)

  1. 如果你真的需要这么多表现,你为什么不用汇编语言编程呢?

  2. 如果您仍然确定您绝对需要担心这一点,请首先检查其他具有更大潜力的优化机会(更好的算法可以使得与任何微优化相比具有更大的差异)。

    < / LI>
  3. 如果你把生活粪便从其他一切中优化出来,唯一可以确定的方法就是剖析。真。无论我们有多么努力猜测,他们都可能会低估JIT。

  4. 我仍然对此有一个看法:一般来说,分支错误预测可能比函数调用受到更多伤害,因为它会破坏缓存。但谁说它编译成可能会破坏缓存的代码呢?编辑:但是因为看起来你正在比较严格相等的文件内容,所以如果长度不同,短路可以节省很多时间(考虑:文件系统需要多长时间告诉你它可能已经知道,几乎没有。你需要多长时间来散列一个10 MB的文件?很长,n比较)。所以,如果我猜对了,那就去做短路,大声喊叫。

答案 1 :(得分:3)

您是否尝试过剖析才能找到答案?你确定其中任何一个都是你申请中的瓶颈吗?

答案 2 :(得分:2)

保持if - 它将运行得更快。

很明显,创建文件的哈希值会比花费更多时间

答案 3 :(得分:1)

在过去,在486和更早的日子里,当CPU“哑”时,分支逻辑(例如if())将导致管道和/或缓存刷新,这会减慢速度。现在,有了现代编译器和无序分支预测,为你的CPU提供清洗,这样的开销很小。

回答问题的唯一正确方法是:对两种方法进行基准测试,看哪种方法更快。

答案 4 :(得分:1)

您在测试过程中观察到的实际表现是否会导致疼痛,或仅仅因为您认为可能会浪费几个周期?如果是第二种情况,解决问题的唯一理智方法就是坚持态度。

分支的成本很难预测,因为现代处理器使用一些非常聪明的技术来加速执行。它们存储一些用于预测分支目标的特殊数据结构。如果预测是正确的,那么分支是非常便宜的,否则相当昂贵。不正确的预测率很低,但当然不是零。我不认为你能为你的问题得到明确的答案

答案 5 :(得分:0)

我的猜测是if语句更好,但是对于今天的高级编译器,你永远无法分辨。你最好的选择是尝试两者并比较性能。

答案 6 :(得分:0)

如果没有剖析,真的很难知道。但无论哪种方式,我都可以告诉您,您的算法通常比iffunction重要得多,而function s通常会更容易更改和更新实现更加轻松,快速,安全,允许您最终做更多工作来改进算法中更重要的部分。而且,再次知道你在做什么的方法是 profile

答案 7 :(得分:0)

答案取决于一件事:“我使用的是完全脑死亡编译器”

既然你不是,答案就是“无所谓”。编译器和JIT'er会严重转换您的代码,因此实际执行的内容与您编写的代码完全不同。

例如,可以内联函数调用,消除函数调用的所有开销。

因此:编写易于理解的代码,作为副作用,编译器在优化代码时也会更容易理解。

答案 8 :(得分:0)

由于分支,

if可能会产生费用。成本取决于在if情况下运行的代码,在else情况下运行的代码,CPU缓存的大小以及编译器决策。

由于调用函数的成本,函数调用可能会产生成本。这可能比if大得多,或者它可以为零(因为调用是内联的 - 当编译器可以“看到”将在编译时调用哪个表单时,甚至可以使用虚拟调用进行内联) ,或者它可以介于两者之间。

因此,这个问题确实没有一般答案。即使您进行了分析,也没有什么可说的,即使使用程序集的二进制副本(因为抖动会有所不同)或使用不同版本的.NET环境(在这里),它在不同的体系结构上也不会有所不同“不同版本”包括服务包,热修复程序和触摸它的补丁程序。)