当前位置:首页 > 每日看点 > 正文内容

如何看待 Rust 写的 PNG 解码器比 C 实现更快?

卡卷网9个月前 (12-15)每日看点161

如何看待?

很简单啊,Rust比C快呗


C不是底层语言

acm有一个很著名的文章:C不是底层语言,你的电脑不是一个更快的PDP11

大体意思是说:C发明出来是老旧计算机PDP11上的一层浅浅抽象。

但是,PDP11出来以后,后世计算机加了十分十分多的科技与狠活。

而C没有跟进这些科技,逐渐落后于时代。

比如 - 随着CPU的pipeline越来越深,branch的代价越来越高,进而CPU引入了conditional move instruction (if (A) B = C;是一条CPU指令)。

C没有跟进。

又比如 - von neumann bottleneck在CPU上越来越严重。为了根治这个问题,CPU使得一条指令可以做很多计算 - simd。

C没有跟进。

又又比如 - CPU时钟周期越来越快,但是相对应的内存latency则几乎没有提升。这导致越来越多的时间花在了内存读取里面,一个指针读取的是L1/L2 cache还是L3 cache/main memory,是底层性能优化最重要的问题。

C没有跟进。

对比下,看看隔壁老黄的CUDA,就知道真正的底层语言是什么样子的了

  • 通过masking执行branch两边,以此避免pipeline stall
  • 默认一切simd
  • 提供scratchpad memory,一种更快但是小小的内存(跟一般的大但慢的分开),而不是指望memory hirearchy自动优化

但问题来了,知不知道那编译器人最多?NVIDIA。老黄一车车拉编译器人去NVIDIA做什么?CUDA编译器。因为GPU的发展越来越复杂,CUDA离GPU越来越远,所以要做的工作越来越多!

所以 - 连CUDA都离真实硬件这么远,又是谁给C勇气自称底层语言的?梁静茹吗?

常规C不如Rust快

如果我们要认为C比Python快,一个不可避免的问题就是 -

为什么我不能整个Python项目就单纯是用Python FFI调一个高度优化的二进制汇编代码?

这样很明显有FFI的语言性能都是一样的(最快的),很明显,这不合理。

问题出在那?问题出在汇编不是Python!

更具体的 - 我们一般写程序都会遵守‘编程守则’。

比如Java:用虚函数不用静态函数,C++:用RAII管理内存,C:用指针传参甚至用指针返回复杂struct,Go:用pair右边来返回错误,没错误是nil。

我们说‘XXX语言怎么怎么样’,一般都是说‘常规(idiomatic)XXX代码’ - 符合这些守则得出的代码,怎么怎么样。道理很明显 - 总不能python说自己又支持OOP又内存安全又快,结果支持OOP又安全的部分很慢,打开快的部分只是内联汇编吧?同理,总不能C说自己又内存安全又快,结果快的部分不内存安全,内存安全的部分内嵌bohm gc拖慢性能吧?这样的宣传策略,太遥遥领先了。

你不能只在你的feature对你有利的时候爱它。

那问题很明显:常规C是一个缓慢的编程语言。

对,libpng没有simd,没有对内存优化存取策略,导致过时了,但这难道不是C的问题吗?

是皮衣黄为了CUDA霸权,强迫C不能有simd不能有scratchpad memory,还是C自己不肯加,落后于时代?

更惨的是,Rust甚至不需要加simd。

When I talked to an LLVM developer about this, they mentioned that it's easier for LLVM to vectorize Rust than C because Rust emitsnoaliasannotations almost everywhere.
LLVM 开发者提到,由于 Rust 几乎到处使用 noalias 属性,相比 C 语言,LLVM 更容易为 Rust 生成自动向量化的代码。

为什么C不能呢?哦,是因为C指针数组模模糊糊分不清,是因为C类型系统更弱,推不出更多的noalias。

所以C更慢。

无限制C不如Rust快

有的人看到这,会说‘不行!我就是要双标,C可以内联汇编Python不可以!’

但那怕如此Rust依然更快。

因为rust的png比C的libpng更快。

唉?我是什么意思?不是说这是因为libpng写得不好吗?

重点正是如此。

libpng是什么?

这可不是路边的任意代码,是png库。而且是被chrome用着的png库。

这种东东,叫做互联网之栋梁不为过吧?

这种库会缺人手维护吗?

如何看待 Rust 写的 PNG 解码器比 C 实现更快?  第1张

很明显,不缺,甚至有一个png仙人写了十多万行代码。第二名也快了,两个加起来平均十万!

如何看待 Rust 写的 PNG 解码器比 C 实现更快?  第2张

另一边呢?哈哈哈,最大奉献着是个头像都没的用户,写了七千五百行搞了个demo就跑路了,渣男!

对比要控制变量。跟博古特赛跑你不能先跑五秒,同理,对比性能要控制工作量,libpng在工作量更多的前提下更慢,不就代表C比rust慢吗?

C自己把libpng维护者时间精力耗完了,还顶着臭脸时不时一套UB segfault组合拳打出去,吓跑其他潜在维护者,导致没有人有时间写simd代码,不怪C怪谁?怪米哈游的原神太好玩,导致png仙人无心写程序?

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/4530.html

分享给朋友:

相关文章

短剧推广怎么做,24年还能赚钱吗?

短剧推广怎么做,24年还能赚钱吗?

首先声明:短剧授权是免费的!短剧授权是免费的!短剧授权是免费的!其次我们再聊聊,短剧推广到底赚不赚钱?多的就不说了,随便上个图片,给大家过过瘾!然后,我们进入主题:0粉丝账号,新手,应该如何申请短剧推广!一、短剧推广变现方式首先,我们先要分...

内存和硬盘的单位都是G,两者的功能是什么?谁能用简单通俗的方式来解读一下?

内存和硬盘的单位都是G,两者的功能是什么?谁能用简单通俗的方式来解读一下?

要弄清楚这个问题,首先要弄清楚什么是内存,什么是硬盘,在计算机的组成结构中有一个很重要的部分是存储器。它是用来存储程序和数据的部件。对于计算机来说,有了存储器,才有记忆功能,,才能保证正常工作。存储器的种类很多。按其用途可分为主存储器与辅助...

2024,java开发,已经炸了吗?

炸的透透的了,坐标南京。一月底,一个好哥们,双休朝九晚六不加班18K,被裁。入职不到两年,算是工资和年终奖才赔了6.5W左右。上周五新公司入职,周六开始加班。现在每周134加班到晚上八点,好像薪资还不如以前高。三月上旬,另一个好哥们,薪资好...

台积电通知其中国客户,从下周开始,所有 7nm 及以下芯片出货将停止。如何看待这一行为?

台积电通知其中国客户,从下周开始,所有 7nm 及以下芯片出货将停止。如何看待这一行为?

我说美国快要没招了,你信么?这次台积电宣布停止向中国大陆客户供应7纳米及更先进AI芯片,再加上前段时间台积电对华为的制裁,我们基本可以认为,台积电在高端芯片领域,已经彻底把大陆给拉黑了,这也意味着中美芯片战已经到了最关键的时刻,一旦我们克服...

有没有高手指点一下Google做SEO现在的技巧啊?心好累。

有没有高手指点一下Google做SEO现在的技巧啊?心好累。

搜索引擎优化 (SEO) 的目标是让 Google 在用户输入相关搜索查询时提供您的网页链接。虽然没有固定的蓝图可以保证您获得最高排名,但有几种 SEO 最佳实践(您可以将其视为 SEO 规则)可以增加您在非付费结果中获得良好排名的机会。谷...

想学习Linux下的ELF文件有什么好书推荐吗?

想学习Linux下的ELF文件有什么好书推荐吗?

大家好,这里是物联网心球。 今天我们来聊聊ELF文件,了解一下Linux如何创建进程以及ELF文件如何转变成Linux进程?1.什么是ELF文件? ELF(Executable and Linkable Format)文...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。