在字符串性能上,传统 C++库被游戏业打的鼻青脸肿。

2022-12-28 09:44:40 +08:00
 tool2d
今年 2022 C++开发者大会上,有一个写游戏的作者,写了个基于 SIMD 优化的字符串,然后对比了传统 std::string 性能,几乎是秒杀了。

要知道 std::string 也进化了那么多年,时至今日,还是被游戏业打的找不到北,只能说游戏业对于性能的无止尽追求的欲望,实在太强了。

作者也开源了( www.youtube.co.jp/watch?v=fglXeSWGVDc ),并附上了性能对比截图:

12611 次点击
所在节点    C++
69 条回复
julyclyde
2022-12-28 09:48:07 +08:00
std::string 只是个接口吧,又没规定具体怎么实现
tool2d
2022-12-28 09:52:00 +08:00
@julyclyde stl 标准库,怎么可能是接口呢。

你去问任何一个写 C++的,都不推荐你自己改写 stl 的库,因为大概率没官方写的好。

比如 std::string 这种,都是世界顶级科学家写出来的。
julyclyde
2022-12-28 09:59:43 +08:00
@tool2d 你好像分不清标准库和标准模板库啊……
建议你还是找任何一个写 C++的多问问,到底是接口还是实现
yehoshua
2022-12-28 09:59:46 +08:00
std::string 毕竟只是标准库,具体应用场景要自己优化的。这是在游戏场景有大规模文字处理下的实现,不至于说传统库就不行了吧。
cubecube
2022-12-28 10:02:18 +08:00
如果没有 SIMD 呢?
标准库要兼容各种运行场景不是
tool2d
2022-12-28 10:05:02 +08:00
@julyclyde 我知道你的意思,你不就是想说,不同的编译器,有自己特殊的 stl 库实现嘛。

你看我那个截图,跨了 windows 平台,mac 平台, linux 平台。并且对比了 x64 和 arm 架构。

stl 库的设计理念基本都是确定的,性能差距并没你想的那么大。
jmc891205
2022-12-28 10:06:44 +08:00
std::string 的性能拉胯是众人皆知的
julyclyde
2022-12-28 10:08:14 +08:00
@tool2d 不同编译器,各有各的实现方法,虽然也包含你说的 stl ,但其实在这个案例中并不是 stl 而是指标准库
这事跟 stl 就没什么关系吧
tool2d
2022-12-28 10:09:56 +08:00
@cubecube "如果没有 SIMD 呢?"

游戏业比较特殊,如果没有 SIMD ,游戏 FPS 就会直接减半,这点很多开发者都没办法接受。

只能强制用户升级 CPU ,加上 AVX 之类的必要属性。
pocarisweat
2022-12-28 10:10:52 +08:00
std::string 首先就应该改名,这玩意只能叫做 std::bytes ,看看人 Rust 和 Swift 这些新语言是怎么处理不定长字符的。

挑战 std::string 的实现非常多,因为字符串在太多领域实在是过于重要了。比如元宇宙公司的 FbString: https://github.com/facebook/folly/blob/main/folly/docs/FBString.md

领域不同,导致对字符串性能的主要需求场景也不同,有些是字符串拼接,有些是快速复制,有些是查找,很难说某个实现真的全部适用。
tool2d
2022-12-28 10:14:40 +08:00
@julyclyde 我被你说的有一点晕,你看 std::string 的实现,是模板实现的啊。
missdeer
2022-12-28 10:15:42 +08:00
OP 的标题作为论点太狭隘了,应该说“在性能上,不用多媒体指令集的 C++库被用多媒体指令集的库打得鼻青脸肿”
paoqi2048
2022-12-28 10:17:47 +08:00
和 UnrealString 相比较呢?
LaTero
2022-12-28 10:19:54 +08:00
“一个写游戏的作者”,说得好像是一个人自己放假没事随便搞的一样,这明明是英伟达一堆雇员画了很长时间专门为图形领域优化的(主要体现在:字符串短,很多时候是从字符串字面量初始化来的,最常用的操作是连接两个字符串)。长字符串这个库和 libstdc++是持平的,而且因为比较 hacky (识别字符串字面量的方法)不可能放进标准库。
Xusually
2022-12-28 10:19:59 +08:00
这个 benchmark 图是 32 Byte String 的成绩,std::string 对长字符串的优化本身就稀烂,超短字符串性能还过得去。
litmxs
2022-12-28 10:27:08 +08:00
C++标准库里面的东西本来就拉跨,比如 regex
没性能需求凑合用,有性能需求只能找找专门的第三方库或者自己手搓
像 stl 这种,大部分第三方库或者框架都会自己实现一套,比如 Qt 、UE 、Google 的 Abseil ,Facebook 的 folly 等等
andyhuzhill
2022-12-28 10:27:49 +08:00
std::string 性能一直不怎么样啊
大多数的 C++工程都会实现自己的 string 类 不用 stl 的
icyalala
2022-12-28 10:30:09 +08:00
CppCon 挺好的分享,结果到楼主这里挑出来一个就说什么 "传统 C++库" 被 "游戏页" 打的找不到北,搞个大新闻。。

我贴出来开源地址: https://github.com/RobloxResearch/SIMDString
人家说得很清楚:这是为 3D 程序的使用场景做的优化,其他使用场景性能可能没那么好,甚至比 std::string 更差。
yulon
2022-12-28 10:33:25 +08:00
但凡你写过几年 C++,标准库的实现从来都是通用而非性能。

你像富文本 GUI 要是直接用 std::string ,内存还不炸了?
lambdaq
2022-12-28 10:35:35 +08:00
路过。。其实这也是为啥 C++ 生态支离破碎的原因。。连字符串这种基础得不能再基础的东西都要发明 n 个轮子争论半天。。所以最后不同的库连最基本的数据结构都不互相兼容。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/905072

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX