情况更新
大家好!距离上次发博文已经有一段时间了,因为最近一直在忙着应对美国对全球发起的互惠关税战导致的股市动荡。股市疯狂下跌,而这可是你见过的最轻松的一个月内从底部反弹50-75%的股票之一。
是的,我当时太专注于我的金融工作了,完全忘了重新戴上我的作家身份。从那以后,我平仓(卖掉了)了大部分在市场底部附近买入的仓位,现在我正在等待下一个下跌周期,这可能需要一段时间。
等待的时间意味着我有空闲时间来写作,耶!!
介绍
好吧,在这篇文章中,我想谈谈在进行基准测试时规范资源成本的重要性。为了更容易理解,假设你正在测试两辆车:第一辆是2500cc的发动机,从0加速到150公里/小时用了10秒。
第二辆车用时短得多,0-150公里/小时加速仅需8秒,但需要7500cc的发动机才能达到这个速度。因此,为了提高20%的速度,需要将发动机功率提高200%。
如果我们不对资源成本进行归一化,看起来第二辆车会轻松获胜。但归一化之后,我们清楚地发现,为了实现 20% 的性能提升,将资源增加三倍的成本实在太高了。
在分析各种能源发电方式的平准化电力成本时,同样的概念也适用:太阳能光伏、风力发电场、水力发电、化石燃料(煤炭、天然气)、核能等。一旦我们将 LCOE 落实到位,您会对这些数字感到惊讶:核电站是最便宜的!
grep和ripgrep
我用来证明平衡/规范资源成本的重要性的工具是 grep 和 ripgrep:两者都是用于在文件中搜索包含模式匹配的行的命令行工具。
Primeagen 的直播给了我启发,他在直播中简要提到了类似这样的话:“ripgrep 比 grep 快,但 ripgrep 占用的 CPU 也多得多”。我对此很感兴趣,因此决定深入研究。
下面是我做的基准测试的一些截图,请注意所使用的 CPU:
-
单线程(ST)grep 和多线程(MT)ripgrep
-
单线程:ripgrep 需要使用
-j1
标志 -
两者都是单线程,对于使用
-uuu
标志的 ripgrep 来说,将产生相同的 963 个匹配。
好的,你明白了:在平准化/标准化的资源使用情况 (将 ripgrep 线程设置为 1) 中,我做的测试显示了一个总体情况:是的,ripgrep 在默认设置下速度很快,但是它也使用了更多的 CPU 资源。当我们将资源使用情况标准化时,它就失去了速度优势。
Ripgrep github 基准测试
现在让我们访问 Ripgrep github ,我们可以分析一些有趣的基准数字:
检查此github 页面以查看 ripgrep 基准测试中使用的原始命令。
你注意到了吗?所有命令都没有使用-j1
标志,该标志使 ripgrep 单线程运行。因此基准测试根本没有标准化,这意味着 grep 使用 1 个线程,而 ripgrep 使用多个线程。这是不公平的。
最后一张截图,下面我演示了如何使用 ripgrep 单线程和多线程。
有点乱,我把相关输出写出来:
- ST grep:99% CPU 总计 0.170
- ST grep : 99% CPU 总计 0.172
- ST ripgrep:93% CPU 总计 0.217
- MT ripgrep:789% CPU 0.051 总计
在 ST (单线程) 中,ripgrep 较慢 (0.217 vs 0.172)。在 MT (多线程) 中,ripgrep 速度惊人:比单线程 grep 快 2.4 倍,然而,它也使用了近 8 个线程来实现这一性能,而 grep 只用了 1 个线程。
这样的表现值得吗?答案留给你吧。看来 Primeagen 说的果然没错!
结论
这篇文章并不是对 ripgrep 或 burntsushi 的攻击,完全不是,写这篇文章的目的是为了深入了解平衡/规范我们正在使用或基准测试的工具或程序的资源使用情况的重要性。
我鼓励编写基准测试的人开始提供资源使用情况数据,这样我们读者就可以判断基准测试是否已标准化。你能接受 2 倍的性能提升,却以 8 倍的资源消耗为代价吗?
有人会争辩说,==“让这些线程空闲/未使用也不好,让我们使用那些空闲线程吧!”==是的,我完全同意这个论点,但是如果你想运行 grep / ripgrep,你是否先关闭其他应用程序(例如:运行虚幻引擎、Godot、VScode、Chrome,打开 20 个选项卡,其中 5 个在 Youtube 上,等等),然后运行 grep / ripgrep?
或者你只是打开所有应用程序并运行 grep/ripgrep?正是我的意思!除非你整天都在运行基准测试,否则测量应用程序的平准化/标准化资源使用情况非常重要。
例如,在我的日常使用中,我保持 3 个工作区打开:
- 工作区 #1:标准办公应用,打开 20-30 个浏览器标签页进行市场调研,其中至少有一个标签页会不停地播放彭博市场直播。有时还会看几个 YouTube 视频。
- 工作区#2:交易应用程序(相当重,因为我正在运行算法交易)。
- 工作区 #3:编程(主要是终端和 Neovim,但有时我会运行 5-6 个 Python 实例来抓取数据或进行一些数字运算)。
你是说,如果我想对文件/目录进行模式匹配,就需要关闭所有这些应用程序,然后运行 ripgrep 吗?不用了,谢谢!
评论区在这里
原文: https://hwisnu.bearblog.dev/levelized-cost-of-resources-in-benchmarks/