gpt4 book ai didi

java - 在 Java 中,哪一段代码更快?

转载 作者:搜寻专家 更新时间:2023-10-30 21:13:16 25 4
gpt4 key购买 nike

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

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

答案就在 this website 上(问题 3)。我就是想不通为什么?来自网站:

3.一个

最佳答案

当你到达最低级别时(机器代码,但我将使用汇编,因为它主要是一对一映射),空循环递减到 0 和一个递增到 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++) {}

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

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

例如,如果您需要从 1 数到 100,000,则应使用第二个循环。这是因为每次需要使用时都必须在循环内计算 100000-i 的事实可能会淹没倒计时(如果有的话)的优势。在汇编术语中,这将是:

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

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

因为每次迭代您只会为递增循环执行一次操作,而每次迭代至少您将执行一次减法操作(假设您将使用i,否则根本不需要循环),您应该使用更自然的版本。

如果你需要向上计数,就向上计数。如果您需要倒数,请倒数。

关于java - 在 Java 中,哪一段代码更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com