< 返回版块

mylvghb 发表于 2019-11-19 11:34

我在学习 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 在进行算数运算这么慢的

评论区

写评论
lygz5016 2019-11-29 13:55

敢不敢试试 let sum:i64 = (1..=100000000).into_iter().sum();

7sDream 2019-11-19 21:03

https://rust.godbolt.org/z/eXqGFr

其实应该没啥差别,优化完只剩下一个 mov 了。

就算有差别应该也只以下可能之一:误差范围/线程调度的偶然影响/操作系统高精度时钟的精度不同/etc

对以下内容的回复:

c5soft 2019-11-19 18:57

还是没有楼下的快,看来我这台ThinkPad T460,i7-6820HQ该退休了

c5soft 2019-11-19 18:54

优化后200ns, 快如闪电

D:\rust\a>cargo r --release
    Finished release [optimized] target(s) in 0.05s
     Running `target\release\a.exe`
elapsed = 200.00 ns
sum = 5000000050000000

D:\rust\a>cargo r
    Finished dev [unoptimized + debuginfo] target(s) in 0.05s
     Running `target\debug\a.exe`
elapsed = 4.71 s
sum = 5000000050000000

7sDream 2019-11-19 12:09

cargo run --release

laizy 2019-11-19 11:57

加 --release了没?这种简单累加代码编译器应该会直接优化掉循环的。

Nugine 2019-11-19 11:54

cargo run --release

debug模式会进行溢出检测,拖慢速度,release模式会关闭溢出检测。

这种求和甚至能被优化掉。

作者 mylvghb 2019-11-19 11:44

我找了一下不是算术运算慢,而是for in比较慢,这是什么原因呢?

1 共 8 条评论, 1 页