为什么解压软件的 cpu 利用率很低?

2024-07-07 20:51:44 +08:00
 xdcatus
我用的是 7zip ,当解压缩文件时我打开任务管理器查看 CPU 的利用率才 2%,用什么方法能使解压缩和压缩文件时充分利用 CPU 的性能?
3009 次点击
所在节点    问与答
15 条回复
killgfat
2024-07-07 20:53:12 +08:00
硬盘读写吃满了吗
xdcatus
2024-07-07 20:56:08 +08:00
@killgfat 这个倒没注意,我通常解压缩的是 nas 里的文件,读写可以达到 110MB/S
ochatokori
2024-07-07 21:30:30 +08:00
@xdcatus #2 这是你网络带宽瓶颈了吧
catalysia
2024-07-07 21:47:35 +08:00
主流系统的 cpu 利用率( windows mac 安卓 ios linux )并不完全代表 cpu 的繁忙程度

现代 cpu 十分复杂 每种晶体管都有自己独特的作用

所以硬件调度器会根据预先的判断来给正在进行的工作一个预期

对每个晶体管是否繁忙进行加权 最后生成一个百分比

这个百分比就是 cpu 利用率

所以 cpu 利用率低 也并不代表 cpu 就不繁忙

解压缩就是其中之一

cpu 的内从控制器要进行复杂的从硬盘到内存再到 3 级缓存 2 级缓存的调度工作

而且类似 7z 等压缩算法 是一环套一环的 你必须完成了前面的才能解压缩后面的

这就导致内存控制器和三级缓存很容易跑满

由于 cpu 利用率对内存控制器和三级缓存的加权并不高 所以才会让你觉得 cpu 不忙 但解压缩速度却不能更快

使用更大的三级缓存的 cpu 比如 x3d 系列 或者更高带宽的内存 可以加快解压缩速度
yyzh
2024-07-07 21:53:22 +08:00
@catalysia 别想那么多,单纯楼主这个只是带宽问题罢了.不过的确现在压缩解压缩算法一堆都是一核有难 N 核围观的.遇到大小核的 U 如果调度出问题了情况更糟
charlie21
2024-07-07 22:01:33 +08:00
视频格式转换的时候 cpu 利用率是很高的
Love4Taylor
2024-07-07 22:15:59 +08:00
ZSTD:
zstd -T$(nproc) 或 export ZSTD_NBTHREADS="$(nproc)"

XZ:
export XZ_OPT="-T$(nproc)"

保证你 CPU 起飞
ysc3839
2024-07-07 22:24:46 +08:00
@catalysia 否的,据我所知大多数情况下用户能看到的“CPU 利用率”就仅仅是一段时间内 CPU 非空闲时间所占百分比。即使是最简单的无限循环,用户看到的也是 100%。你说的需要进行复杂计算得出的真实 CPU 使用率或许是存在的,但是用户用工具看到的一般不是这个。

另外 Windows 任务管理器有个“特性”,就是看到的 CPU 使用率是乘以了当前 CPU 频率比例的。比如说 CPU 基础频率是 2GHz ,目前频率是 4GHz ,那当 CPU 使用率是 50%时,实际会显示 100%。
min
2024-07-07 23:46:44 +08:00
压缩解压缩对 cpu 要求偏低,无法达到你的充分利用 cpu 的期望,就不是个吃 cpu 的任务类型
catalysia
2024-07-08 00:09:13 +08:00
@ysc3839 并不是

微软就曾经出面说过 intel 的 atom 和标准 cpu 以及高通 arm 和 amd 的算法都不一样 不能进行横向对比
一个比较明显的例子是 在 windows xp 酷睿和 Phenom 时期 跑 julia 的时候 amd 的 cpu 会显示跑满了 cpu 而 intel 的标压产品就不会显示跑满 atom 则和 amd 的一样会显示跑满

这是因为 intel 和 amd 的设计原理和权重不一样 对纯浮点算法 intel 的 cpu 可以再跑个整数指令 而 amd 的 3d now !指令集会接管 julia 算法的大多数运算

当然 windows 11 后微软重构了任务管理器的代码 win11 的 cpu 利用率的实现方式似乎和之前有区别了 大多数第三方工具读取利用率的时候都需要调用额外的 api 不过我仍然不认为微软纯使用了占空比
ysc3839
2024-07-08 00:43:06 +08:00
@catalysia 那如何解释最简单的无限循环会显示为 100%呢?
daimiaopeng
2024-07-08 08:06:30 +08:00
换个软件,或者试一下在任务管理器把压缩软件 cpu 的优先级设置为高
sandylaw
2024-07-08 08:45:58 +08:00
开启多线程:
echo "${ALLFILES[*]}" | xargs 7z a -t7z -mx=6 -mmt=on ${VERSION_NAME}.7z
kokutou
2024-07-08 09:09:27 +08:00
解压是单核的, 好多算法都是这样的...

如果你单核性能差 那就是很慢

你看看硬盘占用吧,110m 不就是千兆网, 已经跑满了
ccpp132
2024-07-08 11:54:13 +08:00
具体情况不清楚很难排查

比如一个可能的情况是解压出来大量的小文件,导致大部分时间花在创建新文件这种 i/o 操作上。这些其实都依赖额外的信息从描述是判断不出来的

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

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

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

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

© 2021 V2EX