為什麼 C 語言中從 stdin 讀取行比 Python 慢很多?
背景:
使用 C 從 stdin 讀取字串輸入行可能比 Python 等效項慢得多。出現這種差異的原因是 C 中的預設設定需要更多系統呼叫。
輸入流的預設行為:
預設情況下,C 輸入流 cin 與標準 C I/O 函式庫 (stdio)。這種同步確保輸入不會被緩衝並且一次讀取一個字元。雖然此行為可以防止 cin 流和 stdio 函數之間的衝突,但也會導致效能損失。
系統調用的使用:
當 cin 與 stdio 同步時,每個讀取的字元都會觸發系統調用,這是一個代價高昂的操作。這一開銷會顯著減慢輸入過程,尤其是在讀取大量資料時。
解:
要提高 C 中行讀取的效能,可以停用cin 和 stdio 之間的同步。這可以透過呼叫sync_with_stdio(false)方法來實現。
或者,使用 fgets 函數而不是 getline 也可以繞過同步開銷。
效能比較:
這是原始(同步)C 實作與各種實作之間的效能比較方法:
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not a fair comparison) | 54,644,808 |
結論:
停用cin 與stdio 之間的同步或使用fgets可顯著提高 C 中行讀取的效能,使其與Python 的效率。
以上是為什麼 C 的 cin 從 stdin 讀取行明顯慢於 Python?的詳細內容。更多資訊請關注PHP中文網其他相關文章!