[问题] 请问关于 Rust 跟 C 的速度比较

楼主: os653   2017-08-12 21:49:05
最近在练习 Rust,听说执行速度可以跟 C 相当
但看了下面网页的执行速度比较,似乎 Rust 还是略输一截
https://benchmarksgame.alioth.debian.org/u64q/rust.html
请问这是为什么?
在我的粗略理解上,Rust 的很多东西都是在编译期就处理掉了
而且因为变量的定义较为严格,还有可能编出较短的机械码
那理论上应该会比 C 快才对呀?
作者: loveflames (咕啾咕啾魔法阵)   2017-08-12 22:08:00
你的理论依据没有一个可以当成比C快的理由应该反过来问,为何你会觉得这些会是速度比较快的原因
作者: CoNsTaR ((const *))   2017-08-13 06:11:00
虽然 rust 可以利用规则来简化复杂的东西但是相反的,因为 rust 只能照规则走所以不在规则内的 hack 就没办法过 type check
楼主: os653   2017-08-13 09:49:00
版上的教学网页有提到void foo(int* x, int* y, const int* z){*x += *z;*y += *z;}这样一个函数,因为C的编译器无法确定x、y、z是否是同一块内存位址,而Rust的编译器可以确定,故C编出来的机械码会比Rust多一次读取的动作,就会比较慢一点
作者: CoNsTaR ((const *))   2017-08-13 11:10:00
就说 rust 会在他知道的范围内把东西做到最简所以如果 rust 知道所有最快的 hack而且能够知道同一个语意的所有不同写法那理论上它会是最快的,但事实是不可能,只能尽力例如说,如果有一种机器,它有一个指令能够在一个指令周期内做完 foo 做的事,但是 rust 不知道这个指令,或者是rust 不知道直接呼叫那个指令和执行这一串程式码是相等的(操作语意上),那这两个情况下 C 内嵌组语都会比 rust快而各个 libc 的实作都用了一大堆这种机器相关的 hack,所以 rust 才会这么难超过 C至于为什么我前面说不可能,第一因为这种 hack 可以有无限种,你随时爽往你的机器上加什么特性都可以第二因为对于所有正确的叙述,要判断它们的语意是否相等,常常是 undecidable 的 (有兴趣可以参考 logical semantics)所以如果你不知道两者语意相等,那你就没办法用快的取代慢的例如你上面的例子,如果 rust 不能判定少读一次内存位址的语意是否还和原本一样,那它就没办法用少读一次的版本替换比较慢的版本(虽然这个 case 是可判定的)不知道这样讲有没有比较清楚…
作者: grayStone (灰色石头)   2017-08-13 12:48:00
我对楼上的解读是,没错Rust比较快
作者: PkmX (阿猫)   2017-08-13 15:24:00
compiler和library实做完全不一样啊...
楼主: os653   2017-08-13 18:37:00
我想C大的例子就类似用DMA跟以byte为单位读取资料的差别吧一个用一行指令就完事,一个要用for循环跑几千次这样Rust平常小胜,遇到可以取巧的指令大输,结果就变成小输
作者: james732 (好人超)   2017-08-13 18:49:00
Rust在实作上没有取巧的空间吗?
作者: Hazukashiine (私は幸せです)   2017-08-13 20:42:00
@os653 可以用 restrict 提示 C Compiler 那两个pointer 不会 alias 因此没有你说的那个问题不存在-s 删--xx--
作者: LPH66 (-6.2598534e+18f)   2017-08-14 01:48:00
不过 restrict 只有 C99 有, C++ 因为多型的关系状况复杂restrict 的语意碰上多型会有麻烦所以目前一直都没有规定(连 restrict 在 C++ 都不是关键字)虽然 g++ 有提供 __restrict 给 C++ 用但我不太清楚语意修正一下, 是 C99 以后的 C 才有
作者: ronin728 (浪人)   2017-09-18 08:09:00
那个网站写测试程式的人都尽量压榨效能,你可以点code来看看,C语言的code有强大的GMP护驾 XDDGMP 好歹也是社区经营多年,测试结果数一数二的数学库不过有好几个测资确实无关lib,是rust比较慢

Links booklink

Contact Us: admin [ a t ] ucptt.com