我對斯卡拉非常陌生,我想用相同的性能水平來翻譯我的Java代碼。斯卡拉點產品相對於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毫秒非常簡單。
現在我有斯卡拉
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);
上面的代碼需要比第二我的機器上更做到這一點。 我的想法是,斯卡拉沒有原始數組結構,如Java中的float [],並被集合取代。索引i處的訪問似乎比使用Java中的基本數組的操作要慢。
下面的代碼是更慢:
val maxScore = t.map(r => r zip u map Function.tupled(_*_) reduceLeft (_+_)).max
這需要26S
我應該如何有效地在我的2個陣列迭代計算呢?
非常感謝
你可以在Scala中使用數組...... Scala示例中定義了't'和'u'的地方/如何? –
哎呀,錯過了! 剛剛更新了文章 – ogen
@ogen與您的問題無關,但作爲一個附註,'0直到N'比'0到(N-1)更具慣用性' – fxlae