效能、功耗與能量
吞吐量(throughput)
想像繁忙高速公路上的一個收費站。你可以問它兩個不同的問題。一輛車通過收費站要多久——開上前、付費、抬起柵欄、開走?還是每小時有幾輛車通過?第二個問題就是吞吐量:完成的工作從末端冒出來的速率。一個收費站可能每輛車要六秒(那是它的延遲),但只要車排隊穩定流動,它仍然每小時能處理 600 輛車。
在運算裡,吞吐量是每單位時間完成的工作量——每秒幾條指令、每秒幾個請求、每秒幾張畫面、每秒幾 GB 在匯流排上搬移。當你有一長串彼此獨立的工作、在意的是總量而非任何單一項目時,這就是要緊的量度。管線是經典的吞吐量技巧:靠重疊指令讓好幾條同時在線上飛行,它提升了完成速率,即便每條個別指令花的時間和以前一樣久。當我們談的是搬移的資料量(每秒幾位元組)而非完成的任務數時,吞吐量有時被稱為頻寬。
誠實的配對是吞吐量對延遲,兩者不可互換。增加更多工人(核心、車道、收費站)通常能提升吞吐量,卻對單一工作的延遲毫無幫助——即便開了十個收費站,一輛車還是要六秒。更糟的是,把工作批次擠在一起以讓硬體飽和這類追求吞吐量極大化的技巧,可能拉長任一單一請求的等待。倉儲規模資料中心是為了橫跨數百萬請求的吞吐量而打造的,但仍得奮力把尾端延遲壓低,免得有任何單一使用者被晾太久。
一台伺服器處理每個請求要 50 毫秒(延遲)。用一個工人時,它每秒完成 20 個請求。加到 8 個工人並行,它大約每秒完成 160 個請求(吞吐量升 8 倍)——但每個個別請求仍要 50 毫秒。吞吐量增加,延遲不變。
並行的工人把吞吐量乘上去,卻不碰任一單一工作的延遲。
不要把吞吐量和延遲塌縮成一個「速度」。它們的最佳化方式不同,還會彼此抵換;該看哪一個,完全取決於你在意的是完成的總工作量,還是某一件工作多快結束。
又稱
另見