文章目錄 **CPU 密集型任務(CPU-bound)** 定義: 特點: 常見場景: 如何優化 CPU 密集型任務: **I/O 密集型任務(I/O-bound)** 定義: 特點: 常見場景: 如何優化 I/O 密集型任務: 區別對比表 舉個 Node.js 的例子 應用設計建議 總結一句話:
CPU 密集型任務(CPU-bound)
定義:
指 主要耗費 CPU 資源進行計算 的任務,CPU 不斷運算、幾乎不等待外部輸入。
特點:
CPU 利用率高。 一旦計算開始,很少有等待。 加線程不一定快(線程切換反而浪費資源)。
常見場景:
場景 說明 大量數學運算 / 科學計算 如矩陣乘法、傅里葉變換、圖像處理 數據加解密(如 AES、RSA) 密鑰運算密集,CPU 壓力大 圖像壓縮、視頻編碼 編解碼過程需大量計算 密集循環、排序、統計 尤其處理大數據時 機器學習推理 / 訓練 模型預測和訓練過程非常吃 CPU/GPU
如何優化 CPU 密集型任務:
多核并行(如使用多進程或 worker threads) 使用 C/C++ 擴展或 WebAssembly 加速 使用 GPU 加速(如 TensorFlow + CUDA)
I/O 密集型任務(I/O-bound)
定義:
指 主要耗費等待外部資源(磁盤、網絡、數據庫) 的任務,CPU 經常在等別人干活。
特點:
I/O 阻塞時間遠大于計算時間。 如果使用同步阻塞方式,會讓線程長期“閑置”。 異步編程(如 Node.js、協程)表現更優。
常見場景:
場景 說明 網絡請求 調用第三方 API、抓取網頁等 數據庫操作 SQL 查詢、寫入 文件讀寫 讀取日志、上傳/下載 磁盤緩存、日志記錄 落盤操作 調用外部服務(如 Redis、MQ) 等待對方響應
如何優化 I/O 密集型任務:
使用異步編程(Node.js、Java 的 Netty、Python 的 async) 使用連接池(數據庫、HTTP 等) 使用緩存(如 Redis 減少 DB 壓力) 批量操作(減少 I/O 次數) 利用隊列+線程池異步處理
區別對比表
特征 CPU 密集型 I/O 密集型 主要瓶頸 CPU 運算能力 等待外部資源(網絡/磁盤) 多線程表現 多線程提升不明顯 多線程/異步提升明顯 優化方向 并行計算、算法優化 異步編程、I/O 優化 示例任務 圖像處理、加密、排序、模擬 網絡請求、DB查詢、文件讀寫
舉個 Node.js 的例子
function isPrime ( num ) { for ( let i = 2 ; i < num; i++ ) if ( num % i === 0 ) return false ; return true ;
}
console. time ( "cpu" ) ;
isPrime ( 1e8 + 7 ) ;
console. timeEnd ( "cpu" ) ;
const fs = require ( 'fs' ) ;
console. time ( "io" ) ;
fs. readFile ( 'bigfile.txt' , ( ) => { console. timeEnd ( "io" ) ;
} ) ;
應用設計建議
應用類型 推薦架構 Web API / 網關 異步非阻塞(Node.js、Netty) 算法引擎 / 大計算 多進程 + 高性能語言(C++、Go) 數據采集 / 日志系統 I/O 優化、寫入隊列 圖像/視頻處理系統 多核并行 + GPU
總結一句話:
CPU 密集型任務是“CPU 一直干活”,I/O 密集型任務是“CPU等別人干活”。