你知道計算機在一秒內可以做多少事情嗎?

艾凌風發表於2015-11-03

讓我們看看你有多瞭解你的電腦!所有這些程式裡都包含一個 NUMBER 變數。你的任務是:猜猜需要把 NUMBER 設定為一個多大的數,才能讓相應的程式執行耗時一秒。

你不需要猜出準確數字:它們都介於1到十億之間。猜出數量級即可!注意以下幾點:

  • 如果正確答案是 38,000,那麼猜 10,000 和 100,000 都是正確的。
  • 我們知道,計算機有著不同的硬碟效能、網速和CPU速度!我們試圖讓你能夠區分執行 10次/秒 和 10萬次/秒 的程式碼之間的差別。一臺新的電腦並不能讓你的程式碼執行速度快上1000倍 :)
  • 也就是說,所有的程式碼執行在一臺新款膝上型電腦上,它有著快速的SSD硬碟以及還不錯的網速。C 程式碼全部使用 gcc -O2 來進行編譯

祝你好運!很多問題的答案會出乎你的意料。我們會匿名收集你的答案,未來我們公佈一些圖表哦,敬請期待! =D


歡迎來到第一個問題!這個問題是讓你練練手:

在一秒中之內能執行多少次迴圈?(可能比你想象的要多得多哦!)

猜猜看:1 秒鐘執行迴圈次數

準確答案:550,000,000

猜猜看:1秒鐘執行迴圈次數

準確答案:68,000,000

既然我們已經知道了 Python 的極限(1億 指令/秒),讓我們看一個更加實際的例子。字典在Python中的應用隨處可見,所以,在一秒鐘的時間裡,我們能夠向一個字典新增多少元素呢?

猜猜看:1秒鐘執行迴圈次數

準確答案:11,000,000

當你搞定這題之後,讓我們看一個更復雜的操作,用 Python 內建的 HTTP 請求解析器來解析一個請求

猜猜看:1秒鐘可以解析的HTTP請求數

接下來,我們將會看到,下載一個網頁 vs 執行一個 Python 指令碼!

提示:本題答案都小於1億 :)

猜猜看:1秒鐘可以完成的HTTP請求數

準確答案:4

猜猜看:1秒鐘執行迴圈次數

準確答案:77

啟動程式本身就非常耗時,並不只有是Python是這樣。如果我們只是執行/bin/true,那麼1秒能做500次,所以看起來執行任何程式一般需要大約1毫秒時間。當然,下載網頁的快慢很大程度上取決於網頁大小、網路連線速度、以及伺服器間的距離,今天我們並不會深入探討網路效能(網路效能是一件非常有趣的事情)。一個從事高效能網路開發的朋友告訴我,一次網路往返可以做到250ns(!!!),但是要求計算機距離非常近,同時搭配豪華的硬體配置。對我們和Google來講,耗時是它的一百萬倍。在一個納秒的時間,光只能傳播一英尺,而谷歌的伺服器遠在250英尺以外的地方。

在一秒鐘時間內,可以向硬碟寫多少位元組的資料?我們都知道向記憶體寫資料更快些,但是快多少呢?下面的程式碼在一個裝有SSD的硬碟上執行。

猜猜看:一秒鐘寫入多少位元組

準確答案:342,000,000

猜猜看:一秒鐘寫入多少位元組

準確答案:2,000,000,000

硬碟比記憶體要慢,即使你使用“較慢”的語言,比如Python,這種差別也是有影響的。如果你使用一個非常快速的硬碟(我的SSD已知的寫入速度>500MB/s,可以稱得上快)很多事情最終都受限於硬碟的速度。我們來看下一個例子!

檔案時間到!有時候我執行一條 grep 命令處理大量資料,然後它就一直執行下去了,grep 在一秒內可以搜尋多少位元組的資料呢?

注意,當程式執行時,grep讀入的資料已經全部讀入記憶體。這讓我們能夠知道grep慢的原因,多少是因為搜尋,多少是因為讀取到硬碟。

列出檔案同樣耗時!在一秒鐘內可以列出多少檔案呢?

猜猜看:1秒能夠搜尋多少位元組?

準確答案:2,000,000,000

猜猜看:一秒能夠列出多少檔案?

準確答案:325,000

很好!現在我知道grep可以以2GB/s的速度搜尋,所以,至少在這個例子中,我們程式的速度主要受限於硬碟速度而不是grep的速度。

序列化通常是一個很耗時的工作,尤其是當你需要反覆的序列化/反序列化一份資料的時候,真的非常痛苦。這裡有一些基準測試:解析 64K 的JSON檔案,同樣的資料用 msgpack 格式編碼。

猜猜看:一秒鐘迴圈次數

準確答案:449

猜猜看:一秒鐘迴圈次數

準確答案:4000

基本上任何一個談論序列化的人都會提到 capnproto 可以進行即時的序列化。我們只是想讓你明白,反序列化一個64K的資料需要花上1微妙(據我們所知,這是非常長的時間了),而且你選擇的格式和庫也會帶來非常大的影響。

資料庫。我們並沒有為你準備炫酷的PostgreSQL,取而代之的是我們弄了兩份包含一千萬行資料的SQLite資料表,一份設定了索引,另一份沒有。

猜猜看:一秒鐘執行的查詢次數

準確答案:53000

猜猜看:一秒鐘執行的查詢次數

準確答案:2

並不出乎我們的意料:索引的效果很贊。20幾微秒進行一次帶索引查詢意味著,如果這是基於一個距離很遠的資料伺服器的連線,那麼查詢的時間主要受限於到伺服器的網路往返時間。

下面到雜湊時間啦!在這裡,我們將比較MD5(設計的初衷就是要速度快)和 bcrypt(設計的初衷就是要速度慢)。用MD5你在1秒時間內可以雜湊到相當多的東西,而用 bcrypt 則不能。

猜猜看:一秒內可以雜湊多少位元組的資料

準確答案:455,000,000

猜猜看:一秒內可以雜湊多少位元組的密碼

準確答案:3

接下來,讓我們探討一下記憶體訪問。現在的 CPU 有 L1 和 L2 快取,這比主記憶體訪問速度更快。這意味著,循序訪問記憶體(CPU可以把一大塊資料載入進快取)通常比不按順序訪問記憶體能提供更快的程式碼。

讓我們看看,事實是多麼令我們吃驚吧!你可能需要參考《Latency Numbers Every Programmer Should Know》來猜這一題。

猜猜看:一秒鐘寫的位元組數

準確答案:376,000,000

猜猜看:一秒鐘寫的位元組數

準確答案:68,000,000

我們通常不會寫太多的C程式碼,所以並不會總是受其影響。但是如果你很在意你的命令耗時多少微秒的時候(當你嘗試每秒處理十億資料的時候,你就會在意),你就會很在意此類事情了。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

你知道計算機在一秒內可以做多少事情嗎? 你知道計算機在一秒內可以做多少事情嗎?

相關文章