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

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

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

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

13905 次点击
所在节点    C++
69 条回复
cxxnullptr
2022-12-28 10:40:15 +08:00
OP 能贴一下开源的地址吗,找了半天没找到
glfpes
2022-12-28 10:40:43 +08:00
建议 OP 去干自媒体,引战拿流量的本领有专业风范。
julyclyde
2022-12-28 10:43:56 +08:00
@tool2d 没有 SIMD 的机器现在还存在吗?
julyclyde
2022-12-28 10:44:50 +08:00
@tool2d std::string 是否由模板实现的那无所谓啊,那只是个实现
STL 是指 vector<T>那类东西啊
CrazyRain0001
2022-12-28 10:48:22 +08:00
c++有性能需求的一般都要自己优化吧。不同 CPU 有不同的接口,SIMD 在某些 arm 上可能还不如编译优化,Inter 的用 IPP 也比 SIMD 直接。最终还要看业务逻辑,这个 stl 没法搞
besto
2022-12-28 11:12:55 +08:00
up 不会觉得 GPU 是 SIMD 吧(手动狗头)
across
2022-12-28 11:23:08 +08:00
游戏行业大项目一般不用 std ,这个是兼顾各方平衡用的库,性能当然不突出,最多当标杆参考。
游戏里 json 最常见是 rapidjson ,腾讯 milo yip 写的,快十来年了吧,simd 就有用上,3A 大项目很多都用这个库。最近字节也出了一个库,号称比 rapidjson 快来着,还没仔细看过。
encro
2022-12-28 11:24:23 +08:00
标准库需要考虑完备性,兼容性,统一性和异常处理等,
你只要砍掉任意需求,节省这方面的性能开支,当然能提升性能。

当我们谈论计算机程序性能时,我们需要同时考虑原因和代价等,这是一个有经验程序员都应该知道的。

发这种文章,不分析原因,
要么作者在盲人摸象、道听途说,
要么就是为了哗众取宠而故意断章取义、混淆是非。
phiysng
2022-12-28 11:33:55 +08:00
领域优化的实现比通用实现快很奇怪吗
qieqie
2022-12-28 11:35:05 +08:00
你猜为啥他的 benchmark 要比 32B 而不是 24B 以下(gcc/clang sso),或者 32B(neon, sse 宽寄存器),64B(AVX2)以上呢。
Skifary
2022-12-28 11:37:14 +08:00
多一点包容吧,大多数人应该都有“哇,我发现了一个好厉害的东西,我要去炫耀一下我的发现”的时期,学习和成长都是这么慢慢来的。
qieqie
2022-12-28 11:48:27 +08:00
首先我没有看这个库源代码和视频,根据常识盲给几个结论:
对于小于 24 字节的 string ,编译器在 gcc5/clang6 之后的实现都会有明显性能提升,但是这个 simd string 不会甚至略降(simd 要做 align 和 padding )。
对于大于 32 字节的 string ,simd string 在不支持 avx2 寄存器的环境下都会成倍降低或者 fallback 。
nulIptr
2022-12-28 12:12:24 +08:00
笑死,你能说下哪个正经项目用的 std::string 吗
bashbot
2022-12-28 12:41:53 +08:00
@nulIptr #33

我司做命令行工具的,EDA 行业软件,就是用 std::string ,不然用 char*吗。
能用 STL/std 就不用其他,这个是我们开发的惯例。使用第三方库和代码涉及兼容性、后期维护、授权问题,严重影响开发效率。至于什么字符串性能,加机器就能解决的问题,根本不用考虑。
想想要兼容十年前的服务器硬件和 Arm 最新的硬件,要兼容 Centos6 和 RHEL6~8 ,选一个第三方库前期调研得投入多少精力。老板们常说的话是:代码重构?没有 10 倍以上性能提升就不要考虑重构。

所以什么谁打败谁,完全是看需求,符合使用场景的就是好的,不好的话就是用的人没用好。
dabaibai
2022-12-28 13:12:56 +08:00
15 年前做游戏 都是自己写 string 写字符串渲染 ,字符编码转换等

15 年后的今天 这些东西都进引擎了 也没必要纠结了 用就完了
msg7086
2022-12-28 13:23:39 +08:00
做游戏可以强迫用户换 CPU ,做标准库也可以强迫用户换 CPU 吗?不如换用 avx512 ,人人都得用志强或者 zen4 ,速度快还能拉动 GDP 。
pi1ot
2022-12-28 13:33:18 +08:00
这一行里不会有人拿 std::string 做性能对手,就像做浏览器的没人拿 IE 比性能一样。
openmm
2022-12-28 14:29:09 +08:00
吓死了,光看标题还以为出大事,c++又被吊打了
tyzandhr
2022-12-28 14:29:18 +08:00
所以写 c++的诸位都用的是什么字符串库?莫非用的是 char 数组?
tool2d
2022-12-28 14:42:16 +08:00
@tyzandhr 用自己写的短字符优化的库,理论上 std::string 算法没问题,有问题的是默认的内存分配器,实在很不给力。

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

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

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

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

© 2021 V2EX