这些代码中哪一段在 Java 中速度更快?

2024-03-14

a) for(int i = 100000; i > 0; i--) {}

b) for(int i = 1; i < 100001; i++) {}

答案就在那里这个网站 http://www.mydeveloperconnection.com/html/JavaTrap.htm(问题3)。我就是不明白why?来自网站:

3. a


当您到达最低级别时(机器代码,但我将使用汇编,因为它主要一对一映射),空循环递减到 0 和 1 递增到 50(例如)之间的差异通常沿着行:

      ld  a,50                ld  a,0
loop: dec a             loop: inc a
      jnz loop                cmp a,50
                              jnz loop

这是因为大多数正常 CPU 中的零标志是在达到零时由递减指令设置的。当增量指令达到 50 时,通常不能说同样的情况(因为该值没有什么特别之处,与零不同)。所以你需要将寄存器与50进行比较来设置零标志。


但是,询问两个循环中的哪一个:

for(int i = 100000; i > 0; i--) {}
for(int i = 1; i < 100001; i++) {}

更快(几乎any环境、Java 或其他)是无用的,因为它们都没有做任何有用的事情。这fastest这两个循环的版本根本没有循环。我挑战任何人想出比这更快的版本:-)

只有当您开始在大括号内做一些有用的工作时,它们才会变得有用,此时,work将决定您应该使用哪个顺序。

例如,如果您need要从 1 计数到 100,000,您应该使用第二个循环。这是因为倒计时的优势(如果有的话)很可能会被你必须评估的事实所淹没100000-i每次需要使用它时都在循环内。在装配方面,这将是以下之间的区别:

     ld  b,100000             dsw a
     sub b,a
     dsw b

(dsw当然是臭名昭著的do something with汇编助记符)。

因为每次迭代您只会受到一次递增循环的影响,并且您将受到减法的影响at least每次迭代一次(假设您将使用i,否则根本不需要循环),您应该使用更自然的版本。

如果需要计数,就计数。如果需要倒数,就倒数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这些代码中哪一段在 Java 中速度更快? 的相关文章

随机推荐