計算機執行一條指令要多長時間?

1.這個問題的完整表述(限於標題篇幅)是計算機執行一條指令要多長時間,從內存中取一個word要多長時間(包括緩存命中和未命中的情況),從磁碟上讀取連續的數據要多長時間,定位到磁碟上的新位置又要多長時間?

2.問題出自《用十年時間學習編程》,作者給出了答案,但是並沒有說如何得出的這些答案,這裡給出一篇博客的鏈接用十年學習編程 / Teach Yourself Programming in Ten Years

3.下面是作者給出的答案:

在典型PC機上各種操作的近似時間:

執行典型指令 1/1,000,000,000秒=1納秒

從一級緩存中讀取數據 0.5納秒

分支預測錯誤 5納秒

從二級緩存中讀取數據 7納秒

互斥鎖定/解鎖 25納秒

從主存儲器中讀取數據 100納秒

在 1Gbps 的網路中發送2KB 數據 20,000納秒

從內存中讀取1MB 數據 250,000納秒

從新的磁碟位置讀取數據(尋軌) 8,000,000納秒

從磁碟中讀取1MB 數據 20,000,000納秒

在美國向歐洲發包並返回 150毫秒=150,000,000納秒

4.我是一名大三計算機系學生,我想問的是:如何理解這些問題及如何測試自己機器上的這些指數,最好能從原理上講的明白一些,非常感謝!


Intel 手冊裡面有各個指令佔多少時鐘的吧


計算機執行一條指令要多長時間

看設備,看指令類型,對於intel來說,看這篇文檔:Intel? 64 and IA-32 Architectures Optimization Reference Manual

從內存中取一個word要多長時間(包括緩存命中和未命中的情況)

實際上沒辦法給出準確的時間,因為cache分幾級,每一級的時間開銷也不一樣。甚至有極端情況比如word不對齊怎麼辦?

從磁碟上讀取連續的數據要多長時間,定位到磁碟上的新位置又要多長時間?

看你用什麼樣的硬碟,看你讀什麼樣的數據,機械硬碟和SSD速度肯定不一樣,SSD沒有尋道時間的概念但機械硬碟有。

你說的這些問題大部分都是性能相關的,跟硬體關聯度很大,你說有書上給出了一個答案但我敢打包票說這個答案沒有適用性,也沒有實際意義,因為不同設備,不同測試樣例的差異很大。

甚至,你在十年前的設備上跑和在十年後的設備上跑,結果差別也很大。

執行典型指令 1/1,000,000,000秒=1納秒

從一級緩存中讀取數據 0.5納秒

分支預測錯誤 5納秒

從二級緩存中讀取數據 7納秒

互斥鎖定/解鎖 25納秒

從主存儲器中讀取數據 100納秒

以上的內容應該就是十年前的數據,現在台式機的速度普遍比這個都要快的多,況且現在已經有三級緩存了,CPU的結構也複雜的多。

在 1Gbps 的網路中發送2KB 數據 20,000納秒

這個數據顯然不包括軟體層面上的開銷

從內存中讀取1MB 數據 250,000納秒

從新的磁碟位置讀取數據(尋軌) 8,000,000納秒

從磁碟中讀取1MB 數據 20,000,000納秒

新設備應該比這都快

在美國向歐洲發包並返回 150毫秒=150,000,000納秒

基本上只是傳輸開銷,沒算協議棧開銷。

題主是一個大三計算機的學生,對這些數字,看看就可以了,學好計算機組成原理,了解一下基本原理就夠了,對於細節問題(比如CPU時鐘周期)可以不要太在意,除非確定自己將來要做這個方向

手冊上能一下查到的,不算技術(比如指令開銷);手冊上查完需要理解分析一下的,才是技術(比如段頁式操作)。前者更像是研究茴字有幾種寫法一樣。

你問的這些東西,有些可以查手冊得到,不要太深挖,意義不是很大。打好編程基礎,用C+彙編寫一個簡易的操作系統,會讓你掌握更多的技能,遠比你了解這些東西要重要。


一些是算出來,一些是估計出來的,其實只有量級有指導意義,比如說一條普通指令,現在的CPU遠遠用不了一納秒了,得益於睿頻、多發射等技術的幫助。但是有的指令可能就比較慢,比如一般乘法會比加法慢,除法比乘法慢。其他的可以查手冊。了解這個量級主要是為了讓你理解什麼樣的程序是效率高的程序,什麼樣的程序是效率低的,尤其是涉及到外存和網路IO的時候。比如說,隨機讀取一次磁碟內容的時間可以執行八百萬條指令。


Agner Fog維護著一個不同CPU的instruction latency table: http://www.agner.org/optimize/instruction_tables.pdf 可以看看。 就跟所有reference一樣,大致翻一下就好,需要再查。如果希望了解為什麼不同的指令latency不一樣,可以學習一下體系結構。


除非是給定了場景(cpu架構,指令組)讓你算執行時間,否則關注單條指令的執行時間並沒有太大價值啊。

幾級pipeline,幾級cache,cache命中情況,指令集設計,前後指令的相互依賴引入的control hazard和data hazard,FU和HDU的設計,會讓不同場景下的相同指令有不同的執行時間。


除非專門針對一種型號優化,衡量指令耗時的正確指標應當是「xx個時鐘周期」。廠商通常使用"least xx cycles"來聲明。

考慮到多發射、超標量、超流水線、亂序執行、追蹤緩存等設計越來越複雜,僅評價單條指令耗時比過去要困難。更有意義的指標是經過統計分析的CPI、MIPS數據。

CPI (cycles per instruction)

IPS (instructions per second)

MIPS (millions of instructions per second)

延伸閱讀:

Instruction_latencies_and_throughput_for_AMD_and_Intel_x86_processors

雙核1.7GHz 四核1.2GHz 哪個更強? - Eric Fu 的回答

簡述PC X86處理器上的單核心性能提升歷史 - Amazing - 知乎專欄

必讀書目:

Intel64 and IA-32 Architectures Software Developer"s Manual

Software Optimization Guide for AMD64 Processors


你應該把學習重心放在執行一條指令詳細的過程,精確到微程序,然後再考慮指令流水,超長指令字,並發,各種優化方案。舉例,比如符號控制位,通過在指令中添加數據類型符號,有效縮寫指令種類,或數據位,便於取一大塊數據。對於你說的時間問題,我想科學家用的應該是平均出來的。

你只需知道很快就行了,因為單純執行一條指令,大概有4個周期,取指周期,間址周期,執行周期,中斷周期,每個周期大概就4個機器周期(cpu主頻的倒數),應該是這樣估算的吧,我說錯了不要打臉,這就是理論上一條的執行時間,實際肯定更快,因為各指令功能不同,對應周期數也不同。


你這種做計算機的一般不需要理解,研發CPU的,做soc的,做嵌入式編程的才會關注這種問題。


setup time

可以百度這個。


推薦閱讀:

如何做一個能被別人訪問的網站?
免流的原理到底是什麼?
怎麼破解無線網路?又如何防範?
Mac升級10.9後 銳捷顯示無法找到網卡?

TAG:操作系統 | 計算機 | 計算機網路 | 計算機組成原理 |