Groovy for循环执行时间

res*_*day 12 groovy

O Groovy Gurus,

此代码段大约在1秒内运行

    for (int i in (1..10000000)) {
         j = i;
    }
Run Code Online (Sandbox Code Playgroud)

而这个需要将近9秒

    for (int i = 1; i < 10000000; i++) {
         j = i;
    }
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Kar*_*hah 9

好.这是我的理由?

如果将两个脚本转换为字节码,您会注意到

  1. ForInLoop使用Range.迭代器用于在每个循环期间前进.比较(<)直接用于int(或整数),以确定是否满足退出条件
  2. ForLoop使用传统的增量,检查条件并执行操作.对于检查条件i <10000000,它使用Groovy的ScriptBytecodeAdapter .compareLessThan.如果深入研究该方法的代码,您会发现比较的两个方面都被视为对象,并且有很多事情在进行,转换,将它们作为对象进行比较等.

ScriptBytecodeAdapter .compareLessThan - > ScriptBytecodeAdapter .compareTo - > DefaultTypeTransformation .compareTo

类型处理包中还有其他类,它专门为数学数据类型实现compareTo方法,不确定为什么它们没有被使用,(如果它们没有被使用)

我怀疑这是第二个循环需要更长时间的原因.如果我错了或遗漏某些东西,请再次纠正我...