【问题标题】:Scala operations with arrays performance (scalacl plugin)具有数组性能的 Scala 操作(scalacl 插件)
【发布时间】:2011-12-13 22:44:08
【问题描述】:

使用scalacl plugin有什么缺点吗?

我打算在我的项目中使用 scala。 我在 scala 中写了一点代码来查看它的执行时间。

(1 to 1000000).map(1 + _).sum

1.没有插件

被编译成这样的:

BoxesRunTime.unboxToInt(((TraversableOnce)Predef..MODULE$.intWrapper(1).to(1000000).map(new MyScala..anonfun.1(), IndexedSeq..MODULE$.canBuildFrom())).sum(Numeric.IntIsIntegral..MODULE$));

并在大约 375 毫秒内运行

2。使用 scalacl 插件

 int i = 1;
 int j = 1000000;
 int k = j;
 int m = i;
 for (VectorBuilder localVectorBuilder = new VectorBuilder(); m <= k;) {
     int n = m;
     localVectorBuilder.$plus$eq(BoxesRunTime.boxToInteger(1 + n));
     m += 1;
 }
 int a =  BoxesRunTime.unboxToInt(localVectorBuilder.result().sum(Numeric.IntIsIntegral..MODULE$));

259 毫秒

【问题讨论】:

  • 30% 的提升并不多。我优化了我的代码的一部分,它现在使用数组和 while 循环,以实现 100 倍的加速。惯用的 Scala 可能真的很慢。例如,如果您摆脱拳击,那么您将获得更令人印象深刻的东西。
  • 顺便说一句,Range#sum 现在在主干中进行了优化,并以恒定时间运行O(n),而不是线性O(n)。大多数情况下,算法改进是可取的。

标签: scala scalacl


【解决方案1】:

我能想到的可能缺点:

1) 循环优化似乎有效,开发人员似乎非常称职,但它在“关于 ScalaCL”屏幕中以粗体字显示“ScalaCL 尚未准备好生产!”。换句话说,您可能会引入错误和不稳定

2) 记得每次都用插件编译,否则你可能会突然发现你有性能问题。您无法确定该插件会在中长期保持/兼容

3) 您可能会变得依赖于它的优化,从而导致您编写效率低下的代码,而识别和手动优化瓶颈可能会导致整体上更快的代码。换句话说,它实际上可以“覆盖裂缝”

4) 这是一个额外的库依赖,并增加了构建文件的复杂性

您要求缺点,但与优点相比,这些缺点很小。就个人而言,我会毫不犹豫地将循环优化用于个人项目。对 cl-collections 还不太确定(我尝试过它们,发现我的 GPU 比我的 CPU 慢一点 - obv 它依赖于可用的硬件),但我认为这个项目有一个美好的未来,无论是单独还是并入标准编译器和库。我已经看到一些代码的一些非常显着的加速(最多快 20 倍)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多