【问题标题】:Loop unrolling in Scala vs JavaScala 与 Java 中的循环展开
【发布时间】:2019-07-15 05:01:13
【问题描述】:

循环展开是否适用于在运行时确定迭代次数的循环?例如。是否会考虑在此代码中展开内部循环:

for(int j = 0; j < HUGE_NUMBER; j++) {
  int N = getCount(); // say N = 5
  for(int i = 0; i < N; i++) {
    doSomething(i);
  }
}

循环展开在 Scala 中的工作方式是否不同? JIT 编译器会以同样的方式处理以下代码 sn-ps 吗?

// Java
int N = getCount();
for(int i = 0; i < N; i++) {
  doSomething(i);
}

// Scala
val N = getCount();
var i = 0
while(i < N) {
  doSomething(i);
  i+=1
}

【问题讨论】:

标签: java scala jvm jit


【解决方案1】:

JIT 编译器在 Java 字节码上工作,因此展开行为独立于原始语言,并且取决于正在使用的特定 JVM/编译器。

我不相信 Scala 编译器实现了自己的循环展开。在 Scala 中很少使用这种计数循环,因此可能不值得对其进行优化。

【讨论】:

  • 如果我想查看字节码,我不会发布这个问题。 while 循环比任何类型的数字运算的替代方法都要快得多,因此如果您不想在项目中创建 .java 文件,这是一种方法。
  • 您夸大了 while 循环和展开的好处。这些好处仅适用于一小部分数字运算算法。如果有任何分歧或复杂的计算,好处就会消失,并可能开始损害性能。
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多