【发布时间】:2016-10-17 22:26:43
【问题描述】:
我是 Scala 的新手,我想以相同的性能水平翻译我的 Java 代码。
给定 n 个浮点向量和一个附加向量,我必须计算所有 n 个点积并得到最大值。
使用 Java 对我来说非常简单
public static void main(String[] args) {
int N = 5000000;
int R = 200;
float[][] t = new float[N][R];
float[] u = new float[R];
Random r = new Random();
for (int i = 0;i<N;i++) {
for (int j = 0;j<R;j++) {
if (i == 0) {
u[j] = r.nextFloat();
}
t[i][j] = r.nextFloat();
}
}
long ts = System.currentTimeMillis();
float maxScore = -1.0f;
for (int i = 0;i < N;i++) {
float score = 0.0f;
for (int j = 0; i < R;i++) {
score += u[j] * t[i][j];
}
if (score > maxScore) {
maxScore = score;
}
}
System.out.println(System.currentTimeMillis() - ts);
System.out.println(maxScore);
}
在我的机器上计算时间是 6 毫秒。
现在我必须用 Scala 来做
val t = Array.ofDim[Float](N,R)
val u = Array.ofDim[Float](R)
// Filling with random floats like in Java
val ts = System.currentTimeMillis()
var maxScore: Float = -1.0f
for ( i <- 0 until N) {
var score = 0.0f
for (j <- 0 until R) {
score += u(j) * t(i)(j)
}
if (score > maxScore) {
maxScore = score
}
}
println(System.currentTimeMillis() - ts)
println(maxScore);
上面的代码在我的机器上花费的时间超过了秒。 我的想法是Scala没有Java中的float[]之类的原始数组结构,而是由集合代替。索引 i 处的访问似乎比 Java 中原始数组的访问要慢。
下面的代码更慢:
val maxScore = t.map( r => r zip u map Function.tupled(_*_) reduceLeft (_+_)).max
需要 26 秒
我应该如何有效地迭代我的 2 个数组来计算这个?
非常感谢
【问题讨论】:
-
您可以在 Scala 中使用数组...在 Scala 示例中,
t和u是在哪里/如何定义的? -
糟糕,错过了!刚刚更新了帖子
-
@ogen 与您的问题无关,但作为旁注,
0 until N比0 to (N-1)更惯用