問題
需將 500MB 文件複製到 C、D、E、F 5 個分區,如何最高效?
核心結論
對機械硬盤(HDD),順序單線程複製最快;並發複製反而較慢。
原理分析
- 連續讀寫優勢:HDD 磁頭移動耗時,順序讀取源文件、順序寫入目標分區,磁頭移動最少。
- 並發寫入劣勢:多線程同時寫不同分區,磁頭頻繁在分區間跳躍(隨機 I/O),吞吐率大幅下降。
- OS 快取優化:Windows 檔案系統快取會自動將讀取的資料留在記憶體,後續寫入其他分區時直接從快取讀取,**無需重複讀盤**。
最佳實踐
- **單線程循環複製**:`CopyFile(src, dest1); CopyFile(src, dest2); ...`
- **區塊大小**:若自寫複製程式,使用 ≥ 32MB 緩衝區(如 64MB),減少系統呼叫開銷,發揮順序 I/O 優勢。
- **SSD 例外**:固態硬盤無磁頭移動,並發複製可提升吞吐(受限於控制器佇列深度、通道數),但單線程通常已能跑滿帶寬。
- **跨物理磁盤**:若 C/D/E/F 分佈在**不同物理磁盤**,可考慮並發(各磁盤獨立控制器),但仍受限於源讀取帶寬。
驗證方法
用資源監視器觀察「磁碟活動時間 %」與「佇列長度」,順序複製時活動時間連續、佇列短;並發時佇列長、磁頭跳躍頻繁。