Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有阵列性能的Scala操作(scalacl插件)_Scala_Scalacl - Fatal编程技术网

具有阵列性能的Scala操作(scalacl插件)

具有阵列性能的Scala操作(scalacl插件),scala,scalacl,Scala,Scalacl,使用有什么缺点吗 我计划在我的项目中使用scala。 我已经用scala编写了一些代码来查看它的执行时间 (1 to 1000000).map(1 + _).sum 1。没有插件 int i = 1; int j = 1000000; int k = j; int m = i; for (VectorBuilder localVectorBuilder = new VectorBuilder(); m <= k;) { int n = m; localVec

使用有什么缺点吗

我计划在我的项目中使用scala。 我已经用scala编写了一些代码来查看它的执行时间

(1 to 1000000).map(1 + _).sum
1。没有插件

 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$));
编译为如下内容:

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$));
inti=1;
int j=1000000;
int k=j;
int m=i;

对于(VectorBuilder localVectorBuilder=new VectorBuilder();m我能想到的可能缺点:

1) 循环优化似乎很有效,开发人员似乎很有能力,但在“About ScalaCL”屏幕上用粗体字表示“ScalaCL尚未准备好生产!”。换句话说,您很可能会引入bug和不稳定性

2) 您需要记住每次使用插件进行编译,否则您可能会突然发现性能问题。您无法确定插件在中期或长期内是否会保持/兼容

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

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


你要的是缺点,但与优点相比,这些都是微不足道的。就个人而言,我会毫不犹豫地在个人项目中使用循环优化;目前还不太确定cl集合(我尝试了它们,发现我的GPU比我的CPU慢一点-obv,这取决于可用的硬件),但我认为该项目有着美好的未来,无论是独立的还是并入标准编译器和库中。我看到一些代码的加速效果非常显著(快了20倍左右)。

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