我听说有一次老师放弃了这个,从那以后一直困扰着我。 假设我们想检查整数x是否大于或等于0.有两种方法可以检查: if (x > -1){ //do stuff } 和 if (x >= 0){ //do stuff } 按照这个老师>会稍微快一点,那么>= 。 在这种情况下,它是Java,但据他说,这也适用于C,C ++和其他语言。 这个陈述有没有道理?
这个问题似乎已经解决,甚至被打死了。 聪明的人在这个问题上说了很多聪明的事情 。 要成为一个非常好的程序员, 你需要知道C. 或者你呢? 这周我开了两次。 第一个让我意识到,我的假设并不比我背后的知识更进一步,考虑到我的机器上运行的软件的复杂性,这几乎是不存在的。 但真正把它带回家的是这个Slashdot的评论 : 最终的结果是,我注意到传统的C“裸机”程序员认为实现高级语言的许多天真的方式。 他们在他们影响的项目中做出了不好的“优化”决定,因为他们不知道编译器是如何工作的,或者他们所了解的天真的macros汇编器模型与良好的运行时系统有多大的不同。 然后它打击我:C只是一个抽象 ,像所有其他人一样。 即使CPU本身只是一个抽象! 我从来没有看到过这个问题,因为我没有工具去衡量它。 我很困惑。 Dijkstra对BASIC的评论是否让我的思想残缺不堪? 我是否处于不成熟的优化状态? 有没有希望我,现在我意识到我什么都不知道? 有什么可以知道的,甚至? 那么为什么这么迷人,我过去五年写的所有内容都可能是根本错误的? 总结一下:在知道API文档告诉我的时候有什么价值吗? 编辑:CW。 当然这也意味着现在你必须发布解释器/运行时优化的例子比我们更好:)
这种或那种方式是否有任何性能优势? 它是编译器/虚拟机特定? 我正在使用Hotspot。
在java中有两种if语句 – classic: if {} else {}和shorthand: exp ? value1 : value2 exp ? value1 : value2 。 一个比另一个快吗?还是他们是一样的? 声明: int x; if (expression) { x = 1; } else { x = 2; } 三元操作符: int x = (expression) ? 1 : 2;
在我们的应用程序中更新循环到for-each循环时,我遇到了很多这样的“模式”: for (int i = 0, n = a.length; i < n; i++) { … } 代替 for (int i = 0; i < a.length; i++) { … } 我可以看到你获得集合的性能,因为你不需要在每个循环中调用size()方法。 但是用数组 所以问题出现了: array.length比普通variables更昂贵吗?
正如Knuth所说, 我们应该忘记小效率,大约97%的时间:不成熟的优化是万恶之源。 这是Stack Overflow常常遇到的问题,比如“哪个是最有效的循环机制”,“SQL优化技术? ( 等等 )。 这些优化技巧的标准答案是分析你的代码,看看它是否是一个问题,如果不是,那么你的新技术是不需要的。 我的问题是,如果一个特定的技术是不同的,但不是特别模糊或混淆,可真的被认为是一个不成熟的优化? 以下是Randall Hyde撰写的一篇名为“过早优化的谬误”的文章。