【发布时间】:2014-08-03 08:27:41
【问题描述】:
我只是在填充一个大数组时对 Java 和 Swift 进行了一个小的速度比较。 我想出了以下结果:
斯威夫特
import Foundation
let start = CFAbsoluteTimeGetCurrent()
var intArray = Int[]()
for var i = 0; i <= 300000; ++i {
intArray.append(0)
}
let timeTaken = CFAbsoluteTimeGetCurrent() - start
println(timeTaken)
结果:1.66182696819305
Java
long start = System.currentTimeMillis();
int[] intArray;
int i = 0;
intArray = new int[300000];
for (i = 0; i < 300000; i++) {
intArray[i]=0;
}
System.out.println("Time: "+(System.currentTimeMillis()-start)+"ms");
结果:时间:3ms
这让我有点震惊;
- Swift 比 Java 慢 550 倍。还是我使用了一些未优化的代码?
【问题讨论】:
-
我会非常警惕您的 Java 代码,因为我不认为 JIT 编译器优化整个循环是不合理的,因为您不使用它做任何事情。此外,我怀疑 Swift
append()方法需要做一些额外的幕后工作来将另一个元素添加到数组中,但由于我不太了解这种语言,所以我不能说当然。此外,这两个 sn-ps 并不完全等效,因为您没有在 Java 代码中附加任何内容。我肯定不会称这是一个公平的比较。 -
我同意这一点。听起来很像
append函数在恒定时间内执行,因为没有索引,在 java 代码中时间是线性的。 -
@IvayloToskov 我认为这并不完全正确,因为在 Java 中设置数组元素是常数时间。
append()在恒定时间内执行的唯一方法是如果intArray是一个链表,那绝对不是这样。 -
这两个程序不是等价的。你的结论无效。
-
对这个错误的结论有点困惑!= 不好的问题。
标签: java arrays performance swift