

餿主意:DIR 結果轉存檔案,若同步輸出到螢幕會變多慢?
source link: https://blog.darkthread.net/blog/dir-redirect-stdout-is-slow/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

餿主意:DIR 結果轉存檔案,若同步輸出到螢幕會變多慢?-黑暗執行緒
有些你以為不會錯的直覺,實際上錯得離譜。
在清理 750 萬個檔案資料夾文章提到,我選擇將 DIR 結果寫成檔案方便反覆測試調整,轉存過程用了一招將 DIR 結果同時輸出到檔案與螢幕,理由是看得到進度能化解等待焦慮,有益急躁老人心血管保健。但不少讀者提醒此舉讓原本很耗時的 DIR 轉存動作雪上加霜,乃不智之舉;而依我的直覺,重導到螢幕輸出屬記憶體與 UI 顯示作業,增加的資料處理與顯示運算與 DIR 運算量相比不算嚴重(事實證明這個直覺大錯特錯),不致嚴重拖累效能,反正不想觀察時將 CMD 視窗最小化便可省去晝面 Render 運算,久久再顯示窺探一下,藉此換取資訊掌握度應屬划算。
不過,後來研究 NTFS 檔案佔用磁碟大小 (Size On Disk),呼應了讀者朋友們的分析,DIR 是由 MFT 讀取檔案資訊,每筆記錄 1KB,750 萬個檔案 7.5GB,就算記錄分散各處,用機械硬碟用隨機讀取 4K QD32 標準 33MB/s 評估,DIR 怎麼也不該慢到數小時,莫非這一切是輸出導向到螢幕造成的?
要得到答案,做實驗吧。
【實驗方式】
用 RDP 連上 Windows 10 PC,借用上回建立的兩百萬個檔案當實驗材料,以 Cmder 執行 dir X:\2MFiles > dir.txt
(結果直接轉存檔案) 及 dir X:\2MFiles | tee dir.txt
(結果同時輸出到檔案及螢幕),後者測兩次,一次全程開啟 Cmder 觀察顯示文件、一次將 Cmder 最小化。每次測試前先重新開機,並等待五分鐘再跑測試,排除 Cache 效應及系統服務啟動初期的磁碟 IO。
測試程式如下:
del dir.txt
dir X:\2MFiles > dir.txt
powershell .\check.ps1
check.ps1 會檢查 dir.txt 的建立時間及最後寫入時間,計算 dir 耗用時間長短:
$st = (Get-Item dir.txt).CreationTime
$ed = (Get-Item dir.txt).LastWriteTime
"dir.txt size = $((Get-Item dir.txt).Length.ToString('n0'))"
"Start: $($st.ToString('HH:mm:ss.fff')) End: $($ed.ToString('HH:mm:ss.fff'))"
([TimeSpan]($ed - $st)).TotalMilliseconds.ToString('n3')
第一次測試 dir 結果純寫檔不輸出到螢幕,91.5s 完成。(以 200 萬乘每筆檔案記錄 1KB 推算,資料量 1GB,dir.txt 166KB 寫入部分不計,2G / 91s 約 22MB/s,蠻合理的)
用 tee 轉接到螢幕輸出,時間暴增 30 倍,花了 2700 秒:(註:我忘了 chcp 65001 切 UTF-8 字元變花,懶得重跑請大家無視)
那... 把命令列視窗關起來總會好一些吧?有! 快了三倍,但還是比不顯示慢了 10 倍:
心得:不要盲目相信自己的直覺,多聽不一樣的聲音,有任何疑義,回歸科學邏輯檢驗就對了,以免背離真理而不自知。(感謝 Vt, dir, Daniel Hou 的留言回饋)
以上的實驗結果,不代表 tee 這招不能用,要視應用情境。本案例是因為 200 萬筆檔案目錄資料的磁碟讀取時間遠底於列印 200 萬行文字所需時間,才會造成導向螢幕慢了 30 倍。換個上傳 1000 筆資料的情境,若上傳一筆耗時 5 秒,要顯示的資料量只有 1000 筆,那麼用 tee 存檔兼顯示不會有任何效能衝擊,可以安心使用。
回到最初的問題上,如果用 dir 接 tee 太慢,但看不到進度又會焦慮怎麼辦?其實有個好辦法,dir X:\2MFiles > dir.txt 直接導向,再用 tail 偷看最後幾行就好了,我阿呆~
Recommend
-
8
不死螢幕傳說 2021-04-12 09:50 PM
-
6
Mini LED 與 Quantum HDR 2000 技術加持,49 吋 Samsung Odyssey Neo G9 曲面螢幕動手玩 在 NVIDIA GeForce 與 AMD Radeon 端出新一代支援 HDMI 2.1 規格的顯示卡之後,各螢幕品牌也陸續端出相對應的產品,然而我們可能較多的是見到比...
-
14
資料庫查詢合併外部呼叫結果之效能與容錯設計 - 使用 .NET Polly-黑暗執行緒情境如下:原本 API 由資料庫查詢資料,現今要整合由第三方 API 取得的資料,將二者合併成一個資料陣列傳回呼叫端。最直白的做法是查資料庫得到 List<T> list,呼叫 WebAPI 也取...
-
6
使用 PowerShell 串接 EXE 輸出串流結果-黑暗執行緒 突發奇想,如果手上有個現成 Command Line 的監控性質程式(.EXE),會在執行過程即時輸出事件或統計資訊,有沒有可能把它接進 PowerShell Pipeline 即時分析並做出回應呢? 舉個例子,像是 ping -...
-
11
電子紙的螢幕 BOOX Mira Series 看到「BOOX Mira Series」這個,主要是因為現在公司的老闆是電子墨水的發明人之一 (也是
-
5
【笨問題】命令列執行結果同時輸出到螢幕跟檔案 2022-05...
-
3
更新螢幕
-
4
把電子墨水螢幕透過 VNC 當作外接螢幕 上個禮拜在 Hacker News 上看到的專案,把電子書閱讀器拿來當作...
-
9
【茶包射手筆記】PowerShell 轉存 git 輸出到文字檔,中文變亂碼-黑暗執行緒 問題很簡單。git diff HEAD HEAD~ > diff.txt 將修改差異轉存 diff.txt,在 Cmd DOS 視窗執行沒什麼問題:
-
9
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK