我在学习 Rust 中发现进行求和时要比其它编程语言久,这是什么原因呢?
Rust 代码:
use elapsed::measure_time;
fn main{
let (elapsed, sum) = measure_time(|| {
let mut sum: i64 = 0;
for i in 1..=100000000 {
sum += i;
}
sum
});
println!("elapsed = {}", elapsed);
println!("sum = {}", sum);
}
输出: elapsed = 5.34 s sum = 5000000050000000
而相同运算的 C# 代码:
using System;
using System.Diagnostics;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var stopwatch = Stopwatch.StartNew();
long sum = 0;
for (var i = 1; i <= 100000000; i++)
{
sum += i;
}
stopwatch.Stop();
Console.WriteLine("elapsed = {0} ms", stopwatch.ElapsedMilliseconds);
Console.WriteLine("sum = {0}", sum);
}
}
}
输出:
elapsed = 296 ms sum = 5000000050000000
我想知道是什么原因导致 Rust 在进行算数运算这么慢的
1
共 8 条评论, 1 页
评论区
写评论敢不敢试试 let sum:i64 = (1..=100000000).into_iter().sum();
https://rust.godbolt.org/z/eXqGFr
其实应该没啥差别,优化完只剩下一个 mov 了。
就算有差别应该也只以下可能之一:误差范围/线程调度的偶然影响/操作系统高精度时钟的精度不同/etc
对以下内容的回复:
还是没有楼下的快,看来我这台ThinkPad T460,i7-6820HQ该退休了
优化后200ns, 快如闪电
cargo run --release
加 --release了没?这种简单累加代码编译器应该会直接优化掉循环的。
cargo run --release
debug模式会进行溢出检测,拖慢速度,release模式会关闭溢出检测。
这种求和甚至能被优化掉。
我找了一下不是算术运算慢,而是for in比较慢,这是什么原因呢?