我在Java和Rust上运行了一个相同的小基准测试。
Java:
Translated:
我在Java和Rust上运行了一个相同的小基准测试。
Java:
public class Main {
private static final int NUM_ITERS = 100;
public static void main(String[] args) {
long tInit = System.nanoTime();
int c = 0;
for (int i = 0; i < NUM_ITERS; ++i) {
for (int j = 0; j < NUM_ITERS; ++j) {
for (int k = 0; k < NUM_ITERS; ++k) {
if (i*i + j*j == k*k) {
++c;
System.out.println(i + " " + j + " " + k);
}
}
}
}
System.out.println(c);
System.out.println(System.nanoTime() - tInit);
}
}
Rust:
use std::time::SystemTime;
const NUM_ITERS: i32 = 100;
fn main() {
let t_init = SystemTime::now();
let mut c = 0;
for i in 0..NUM_ITERS {
for j in 0..NUM_ITERS {
for k in 0..NUM_ITERS {
if i*i + j*j == k*k {
c += 1;
println!("{} {} {}", i, j, k);
}
}
}
}
println!("{}", c);
println!("{}", t_init.elapsed().unwrap().as_nanos());
}
当NUM_ITERS = 100
时,如预期,Rust的表现优于Java。
Java: 59311348 ns
Rust: 29629242 ns
但对于NUM_ITERS = 1000
,我发现Rust花费的时间更长,而Java则更快。
Java: 1585835361 ns
Rust: 28623818145 ns
这是什么原因呢?难道Rust在这种情况下表现不比Java更好吗?还是我的实现中出现了一些错误?
更新
我从代码中删除了System.out.println(i + " " + j + " " + k);
和println!("{} {} {}", i, j, k);
这两行。这是输出结果:
NUM_ITERS = 100
Java: 3843114 ns
Rust: 29072345 ns
NUM_ITERS = 1000
Java: 1014829974 ns
Rust: 28402166953 ns
因此,在没有 println
语句的情况下,Java 在两种情况下的性能均优于 Rust。我只是想知道为什么会出现这种情况。Java 运行 Garbage Collector 和其他开销。我没有最佳地在 Rust 中实现循环吗?
a2 + b2 = c2
(使用NUM_ITERS = 100)。 - Marko Topolnikcargo run --release
以运行优化的代码。 - Deadbeef