我有两个版本的代码对角遍历MxN矩阵.显然,即使使用相同的(糟糕的)遍历逻辑,使用Java Streams的版本运行速度比不使用Java Streams的版本慢5倍.
约束条件:
- 1<;=M,N<;=10^4
- 1 = M * N = 10 ^4<<
Version 1: Using for loops:
public int[] findDiagonalOrder(int[][] mat) {
int M = mat.length;
int N = mat[0].length;
int[] traversal = new int[M * N];
int s = 0;
for(int sum=0; sum < M+N; sum++) {
for(int k=0; k<=sum; k++) {
int row = (sum%2 == 0) ? sum - k : k;
if (row < M && (sum-row < N))
traversal[s++] = mat[row][sum-row];
}
}
return traversal;
}
Version 2: Using Java Streams:
public int[] findDiagonalOrder(int[][] matrix) {
int M = matrix.length;
int N = matrix[0].length;
return IntStream.range(0, M+N)
.flatMap(sum -> IntStream.rangeClosed(0, sum)
.filter(i -> {
int row = (sum%2 == 0) ? (sum-i) : i;
return row < M && (sum - row) < N;
})
.map(i -> (sum%2 == 0) ? matrix[sum-i][i] : matrix[i][sum-i]))
.toArray();
}
版本#1的运行时间约为353 msec,而版本#2的运行时间约为1500 msec.我想知道,是什么导致了性能下降?我甚至没有使用Boxing/Unboxing,这可能会产生影响.
PS:我知道有一个更好的方法来进行矩阵遍历O(M * N),但我的问题是关于Streams.