解壓縮操作為什麼不吃CPU?

剛用好壓解壓了一個壓縮包,發現即使調到效率模式,好壓進程對於CPU的佔用率也只在25%左右徘徊,我用的還是五年前的老本(Core i3 330M)。

為了排除機械硬碟讀寫瓶頸,我又把壓縮包放到SSD上解壓,發現CPU佔用率和解壓速度也沒有變化。

不禁好奇:解壓不應該是完成一系列固定任務的過程么?既然任務固定,那麼理應通過盡量多的佔用CPU時間來快速完成任務。為什麼解壓軟體並不是非常佔用CPU資源呢?

有朋友說是單線程的原因,我又補充了下測試:

1.換了支持多線程的winrar X64和7-zip X64,在SSD上測試,CPU佔用率還是突破不了40%。其中7-zip表現和好壓差不多,汗...

2.又測試了下在RAMDISK下的性能,用的是Qsoft Ramdisk X64版本,建立3G虛擬盤,壓了5集低清晰老友記扔到虛擬盤。仍然用7-Zip X64和winRAR X64測試解壓到虛擬盤,佔用率仍然沒有提升。


因為讀取速度不夠快。

要讓解壓縮時cpu達到100%,目前只有用ram內存做硬碟,其它存儲器基本達不到。

ssd的讀取速度對於解壓縮來說還是太慢太慢了,cpu根本喂不飽。

實測用ramdisk+7zip可以達到100佔用。


首先,能是肯定能的,在極端特殊的條件下,可以佔滿CPU。下圖是我的測試條件截圖:

我的測試里,壓縮一個視頻,使用最高壓縮比,字典設置成本機能承受的最大值,解壓時綁定CPU到單核上,在ramdisk上解壓使用右鍵-解壓的方法(這種才能避免使用臨時文件),壓縮時使用AES-256加密

可以看到CPU使用率佔滿。

為何平時很難佔滿:

1、普通磁碟也好,SSD也好,速度都太慢,解壓的時候需要等IO,如果要不等,唯一的手段是使用ramdisk,但這種測試,我認為ramdisk大小至少要到128G以上,沒有土豪配置,實在太難實驗,小內存還沒等佔滿CPU的時候,就已經解壓完了。

2、解壓的本質是查字典,所以幾乎就是大量的memcmp+memcpy,這種操作要佔滿CPU並不容易,解壓的過程沒有大量的計算,所以CPU很難佔滿,字典越大,解壓時負載越大,但根據7-ZIP的信息,字典太大時,壓縮需要的內存就太大了:

我認為,要想讓解壓時負擔大一點,壓縮時要盡量用最大字典,但目前7-zip支持的最大字典,在壓縮時需要45G內存。

要想佔滿CPU,也可以,找一個CPU慢,內存大,核心少的老電腦,在ramdisk上,解壓時就可以佔滿了。

然後,我想到了一個辦法:創建一個虛擬機,綁定單核,最大內存,於是,成功佔滿:


感覺和壓縮內容本身也有關係。題主給出的是壓縮視頻,視頻本身的壓縮率已經比較高了(冗餘數據少),再去壓縮的壓縮率不會很高,所以解壓縮時需要CPU計算量可能不會太大。

還有壓縮時選擇的壓縮模式是否選擇最高級別,最低和最高差別也很大。


因為i3 330M是雙核四線程,而解壓縮是單線程的,解壓縮最多只能用到四線程中的一個,所以全部佔滿也就是25%.


硬碟的速度限制了,比如你的cpu一秒能吃十個包子可你的硬碟只送來2個,當然占不滿咯


有磁碟IO的瓶頸限制咯~


推薦閱讀:

CS申請新思路 — Professional Master
計算機是個很好的工具箱
為什麼晶圓都是圓的不是方的?
談談為什麼上scala?
把「hotkey」翻譯為「熱鍵」是否不妥?

TAG:中央處理器CPU | 演算法 | 計算機 | 壓縮 |