具有阵列性能的Scala操作(scalacl插件)
使用有什么缺点吗 我计划在我的项目中使用scala。 我已经用scala编写了一些代码来查看它的执行时间具有阵列性能的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
(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)
。大多数情况下,算法改进是可取的。