C_and_CPP 板


LINE

※ 引述《os653 ()》之铭言: : 最近在练习 Rust,听说执行速度可以跟 C 相当 : 但看了下面网页的执行速度比较,似乎 Rust 还是略输一截 : https://benchmarksgame.alioth.debian.org/u64q/rust.html : 请问这是为什麽? : 在我的粗略理解上,Rust 的很多东西都是在编译期就处理掉了 : 而且因为变数的定义较为严格,还有可能编出较短的机械码 : 那理论上应该会比 C 快才对呀? Hi, 在开始说明前,建议你可以先看一下 benchmarks game 针对效能比较的说明 https://benchmarksgame.alioth.debian.org/dont-jump-to-conclusions.html 他们开宗明义就讲:每个程式语言设计时要达成的目标不一样 单纯地实作相同演算法并比较它们的效能,其实是LP比鸡腿 Rust 在设计上的首要目标是 memory safe 与 thread safe 并且在提供高阶抽象化的同时,尽可能维持良好的执行效能 而 C 的目标是取代当时 (1973) 虽然效能好但不易跨平台的组合语言 因此它允许 undefined behavior,而且提供许多低阶的操作 确实 Rust 在 compile time 就做了许多 safety check 来提高 runtime 效率 但有些与 memory safety 相关的检查确实很难在 compile time 实现 而 C compiler 根本就不管 memory safety 的 这种时候,Rust 的执行效率确实会比 C 还要慢 最简单最常见的例子就是阵列存取 像这样的程式码: array[i] = x; Rust 的效率会明显低於 C 因为 compiler 无法在 compile time 确认 i 是否落在 array 的长度限制内 为了不引发 undefined behavior,它必需在 runtime 帮你做边界检查。 事实上,所有 memory safe 的语言,在这样的阵列存取时都会做边界检查。 大家会说 Rust 的效能很好,多半是与其它 memory safe 的语言比较 比如说 C# / Java / Go,而不是和 C 比较。 * * * 所以 Rust 一定比 C 还要慢吗?那也不一定。 你可以看看 C 与 C++ 在 benchmarks game 上面的比较, 几乎所有的测试中 C 都比 C++ 还要快。 但是,如果你比较 C++ 的 std::sort 与 C 的 qsort 那麽 C++ 肯定是压倒性的胜利 当然,如果要比排序,你还是可以用 C 手刻一个与 C++ sort 相同的版本 但,当你使用某个语言写程式,而标准函式库提供了 qsort 你还会手刻一个自己的 sort 出来吗? 「使用某语言」在一定程度上,包含了「使用某语言的library」 这也算是 benchmarks game 的一项规则 上面的测试程式码会尽可能使用该语言提供的函式库 以符合使用该语言写程式的普遍情况 因此,benchmarks game 上面某个语言的效能,应该要被理解为它的「平均表现」 而不是该语言的「极限」 以 C 与 Rust 的比较中,其中 C 表现得比较好的测试像是 mandelbrot 或 n-body C 都使用了 SIMD 指令以提昇效率 但是目前 Rust 的 SIMD 尚未成为标准功能,因此范例码中也未使用 SIMD 加速 这是否表示 Rust 不能用 SIMD 呢?并不是 你真的想做,还是可以用 unsafe block 与 inline asm 做到 但这不会是 Rust programming 的常态 毕竟如果你那麽在意效能,觉得效能比 memory safe 或易读易写更重要 那 C 还是比较适合的选择 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.227.5.133
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1502645537.A.264.html
1F:推 FRAXIS: C 的 qsort 比 C++ 的 std::sort 慢是差在 template? 08/14 06:05
2F:推 LPH66: 可能是; C++ 有 template 所以可以 inline 比较函式 08/14 07:49
3F:→ LPH66: 但 qsort 一定是(间接)呼叫 08/14 07:49
4F:→ LPH66: 我没实测过所以这只是推测就是了 08/14 07:50
5F:→ fatrabitree: std::sort不是单纯quick sort 08/14 08:49
6F:→ Sidney0503: quick sort到一半改用heap sort 这是现在最快的 08/14 10:31
7F:→ Sidney0503: 纯比较排序法 08/14 10:31
8F:推 johnlinvc: std:sort 用的是 intro sort 08/14 11:31
9F:→ freeunixer: 以前都苦干几个以下用哪种,几个以上用哪种,多少要拆. 08/14 11:57
10F:→ tinlans: SGI STL 的 std::sort 不是 quick sort 08/14 15:28
11F:推 LPH66: 喔对, 忘了它是 intro sort... 08/15 00:01
12F:推 os653: 感谢说明,其实我也很好奇为啥在C的部分会看到omp的东西 08/16 22:27
13F:→ os653: 想说比速度不是应该用同条件去比才对吗? 08/16 22:27
14F:→ os653: 照您的说法就说得通了 08/16 22:29
15F:推 firejox: 不同的lib的std::sort 实作都不太一样,clang的好像是5p 08/19 10:47
16F:→ firejox: ivot的quick sort 08/19 10:47







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP