rust为什么跑得比js慢

发布于 2022-09-11 18:43:04 字数 867 浏览 29 评论 0

问题描述

实现一个计算斐波那契数列的递归函数, rust代码和js代码在我的电脑上耗时都是11秒, js甚至比rust快一点

问题出现的环境背景

本人刚接触rust,听说它的性能可以和C++媲美,所以就想比较一下到底比js快多少,可是程序跑出来的结果和想象中的不太一样,顺带一提,在我同事的电脑上用C++跑耗时7秒,当传入参数为50时,他那边C++耗时73秒,我这边rust耗时132秒,差别太大了

相关代码

rust代码:

extern crate stopwatch;
use stopwatch::{Stopwatch};

fn fid(num: u64) -> u64 {
    match num {
        0 => 0,
        1 => 1,
        _ => fid(num - 1) + fid(num - 2)
    }
}

fn main(){
    let sw = Stopwatch::start_new();
    let num = fid(45);
    println!("{}",num);
    println!("耗时: {}ms", sw.elapsed_ms());
}

js代码:

function fid(n) {
  if (n == 0) return 0;
  if (n == 1) return 1;
  return fid(n-1) + fid(n-2)
}
fib(45)

你期待的结果是什么?实际看到的错误信息又是什么?

按理来说rust的速度应该比js快很多才对吧?希望大佬们能指点一下我是不是rust代码哪里用错了,或者是有什么地方可以优化的,谢谢.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我的黑色迷你裙 2022-09-18 18:43:05

机器surface go
rust-release 15秒
rust-debug 27秒
chrome 29秒

你是我的挚爱i 2022-09-18 18:43:05
fn fibonacci(n: u64) -> u64 {
  if n == 0 || n == 1 {
    return 1;
  }
  let mut n_p_2 = 1;
  let mut n_p_1 = 1;
  let mut result = 0;
  for _ in 2..n+1 {
    result = n_p_1 + n_p_2;
    n_p_2 = n_p_1;
    n_p_1 = result;
  }
  return result;
}
墨洒年华 2022-09-18 18:43:05

相同的实现,rust比js慢是不存在的。但是递归本来就慢,因为要申请很多栈内存,而且很可能溢出。如果是要对比rust和js递归效率,其实js比rust更快(递归次数多的时候),因为js有尾调优化,rust暂时还不支持,但是你这个js实现不是尾调递归,所以也不可能比rust快。如果你的js实现是:

function fid(n, a=1 , b=1){
    if(n <= 2){
        return a;
    }
    return fid(n - 1, a+b, a);
}
fid(1476) // 结果是 1.3069892237633987e+308  再大就超出范围了

你会发现它能秒算出,而且不会溢出,因为尾调优化了。不然你算一个很大的数,可能就卡死或直接崩了。如果你再用rust实现一个非递归的实现肯定要比js快,但是也快不了多少,因为这个计算本来就很简单,如果是大量的计算,差距就明显了。

煮酒 2022-09-18 18:43:05

我机器上
js : 37.905s
rust : 7.6654385s

fn fid(num: u64) -> u64 {
    if num > 1{
        fid(num - 1) + fid(num - 2)
    }else if num == 1{
        1
    }else{
        0
    }
}

改一下
rust : 6.6643812s

孤独患者 2022-09-18 18:43:04

我机器上rust编译release测试9秒,js29秒
你是不是debug模式编译测得,那自然慢

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文