7

使用scalacl 插件有什么缺点吗?

我打算在我的项目中使用 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 毫秒

4

1 回答 1

10

我能想到的可能的缺点:

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

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

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

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

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

于 2011-12-13T23:57:23.853 回答