我正在写一个有趣的程序,并且每次演奏都对我来说非常痛苦。 所以我想知道什么更好 - 做一个额外的“if”语句来减少一些函数调用,或者避免那些“如果”和更多funciton调用。该函数是虚方法,它覆盖IEqualityComparer的方法Equals,它只是比较两个文件的大小和散列值。 if语句比较这两个文件的大小。我认为你有这个逻辑的重点。你可以看到我正在用C#编写这个程序。所以也许任何人都可以回答我,因为这不是我第一次想知道要选什么。感谢速度更快 - if语句还是函数的调用?
回答
我的猜测是,如果一个语句是更好的,但与当今先进的编译器,你永远不能告诉。你最好的选择是尝试两种方式并比较性能。
您是否尝试过分析找出?你确定这些中的任何一个是你应用程序中的瓶颈吗?
当然没有。在我看来,这些时刻更是瓶颈。一切安好。我无法决定选择什么。 分析工作非常巧妙。当我比较目录中的所有文件和它的子目录时,即使我改变了很多东西,也比下次它做同样的工作快40倍。所以我不能比较相同文件夹的结果=( – Mark 2010-08-08 18:39:18
@Mark:如果你不知道它是否会产生任何影响,这种决定是毫无意义的! – 2010-08-08 18:51:33
在过去的486和更旧的日子里,当CPU处于“哑”状态时,分支逻辑(例如if()
)会导致管道和/或缓存刷新,这会降低速度。现在,随着现代编译器和无序分支机构预测为您洗碗碟机的CPU,这种开销很小。
的唯一正确的方法回答你的问题是:基准这两种方法,看看这是更快。
是由你观察到在测试或只是一个事实,即你想想浪费了几个周期的可能性实际性能的痛苦?如果是第二种情况,解决问题的唯一有效方法就是通过工作态度。
分支机构的成本是很难预测的,因为现代处理器使用一些非常聪明的技术,以加速执行。它们存储一些用于预测分支目标的特殊数据结构。如果预测是正确的,那么这个分支很便宜,否则就很昂贵。错误预测的比率很低,但当然不是零。我不认为你可以得到一个明确的答复你的问题
如果你真的需要这么多的表现如此糟糕,你为什么不采用汇编语言编程?
如果您仍然确定您确实需要担心这个问题,请首先检查其他优化机会,这些优化机会有更大的潜力(更好的算法可能会使数量级比任何微优化更差)。
如果优化生活狗屎了一切的,可以肯定的唯一方式是个人资料。真。无论我们中的任何人试图猜测,他们都可能会低估JIT。
不过我对这个意见:一般来说,分支预测错误可能会伤害远不止一个函数调用,因为它螺丝缓存。但是谁说它会编译成可能会导致缓存的代码?编辑:但是,因为它看起来像是比较文件内容的严格相等性,所以在长度不同的情况下短路可以节省很多时间(考虑:文件系统告诉你这个长度需要多长时间?知道,几乎没有。需要多长时间散列10 MB文件?很长,n比较)。所以如果我猜对了,那就去短路,大声喊叫。
没有分析就很难知道。但无论哪种方式,我都可以告诉你,你的算法通常比if
vs function
重要得多,而通过function
通常可以更容易,更快速,更安全地更换和更新实现。最终要做更多的工作来改进算法中更重要的部分。而且,再次,知道你在那里做的方式是简介。
好的,谢谢你们。我得到了我正在寻找的答案 - “现在人们可以真正告诉我”。这真的是我期待听到的。所以谢谢。 – Mark 2010-08-08 18:31:16
答案取决于一两件事:“我使用的是一个完全新空房禁地编译”
既然你不是,答案是“没关系”。编译器和JIT'er大量转换您的代码,所以实际执行的内容与您编写的代码完全不同。
例如,函数调用可以内联,消除函数调用的所有开销。
因此:编写易于理解的代码,并且作为一项附加功能,编译器在优化代码时也会变得更容易理解。
保留 - 如果 - 运行速度会更快。
很明显,创建一个文件的哈希将花费相当多比if更多的时间。
if
由于分支可能会产生成本。成本取决于在if情况下运行的代码,在else情况下运行的代码,CPU高速缓存的大小以及编译器决策。
函数调用可能会因调用函数的代价而产生成本。这可能比if
大得多,或者它可能为零(因为调用是内联的 - 甚至当编译器可以“看到”在编译时将调用哪个窗体时虚拟调用也会发生内联),或者它可以介于两者之间。
因此,这个问题确实没有一般的答案。即使你进行配置文件,也没有什么可以说,即使使用程序集的二进制副本(因为抖动会不同),或者使用不同版本的.NET环境,在另一种架构上也不会有所不同(在此处“不同版本”包括服务包,热修补程序和修补程序)。
- 1. 速度更快:noop函数调用还是语句?
- 2. 快速减少if语句的长度
- 3. 速度更快/使用更好:MySQL还是PHP md5函数?
- 4. 快速矿工 - IF语句
- 5. 使用虚函数而不是IF语句更快?
- 6. C++ if语句速度
- 7. 速度更快:JDBC还是JNDI?
- 8. 速度更快...循环还是分裂?
- 9. 快速输入if语句的方式?
- 10. 速度更快? if()function()OR function(){if()}?
- 11. 在if语句中调用函数?
- 12. 的jQuery/JavaScript的if语句速度
- 13. 是php的'include'函数还是语句?
- 14. 速记IF语句
- 15. 速记if语句
- 16. 为什么“不”比Python中的“bool()”更快(或者,Python函数的速度与语句的速度)?
- 17. jquery函数if语句
- 18. 执行速度更快还是更优化? C#
- 19. Java Swing;选择if语句还是do-while语句?
- 20. If语句空调
- 21. PHP select语句需要快速更正
- 22. 递归的速度更快:javascript服务器端还是freemarker?
- 23. 速记if语句PHP
- 24. 循环时花费更多;分配还是if语句?
- 25. 如何调用Meteor.js中if语句中的元素的函数?
- 26. 在if语句中不能使用快速查看wile调试Visual Studio
- 27. 函数中的IF语句的问题
- 28. 如何用IF语句执行函数?
- 29. 如何在Python中的if语句中调用某个函数?
- 30. 当jquery中的if语句失败时调用函数
没有代码,你的问题非常模糊。即使有了代码,我仍然期望在不知道实际情况的情况下仍然有点模糊。 – 2010-08-08 17:42:44
'关闭不是一个真正的问题'?真的吗? *卷眼睛* – 2010-08-08 19:11:41