2011-03-27 75 views
1

我目前正在研究一個C++項目,其中涉及讀取全部爲ASCII格式的數千個小(〜20kb)文本文件。什麼是更快的閱讀,ASCII或二進制?

在分析之前將所有文件轉換爲二進制文件,我能否獲得顯着的性能改進?

回答

0

也許,是的。但是,那麼通過檢查來驗證輸入文件是不可能的,你將不得不花時間編寫代碼來對它們進行代碼轉換,並用新的代碼來讀取它們。如果您發現I/O時間是一個重大問題,我只會這樣做。

6

如果您正在處理文本,那麼「ASCII」和「Binary」之間沒有真正的區別。 ASCII是將二進制數據解釋爲文本。所以,如果我正確理解你的問題,答案是否定的,沒有可能的轉換,並且沒有性能改進。

2

以二進制格式存儲的數據有兩個優點:

  • 它佔據較少的存儲(較少的磁盤IO)
  • 它更快讀取(沒有費時字符串解析)

因此,如果將文本表示法轉換爲緊密壓縮的二進制格式,將會有性能改進,但是如果它們是重要取決於您的特定情況。

如果數據流已經是一個性能瓶頸,切換到二進制格式(甚至可能壓縮 - 從磁盤讀取本質上很慢)可以帶來很多。

+0

「沒有費時的字符串解析」 - 你是什麼意思?你仍然需要解析你的輸入以將其存儲在數據結構中嗎? – Korchkidu 2013-11-26 07:02:08

0

當二進制格式使得您最小化解析的任何要求時,您可以在加載時獲得性能增益。例如,內容可以直接映射到「結構轉儲」中的大塊中轉儲。除此之外的每一步都會導致性能下降。最終是否超過ASCII將部分取決於ASCII開始的複雜/低效率。

步驟花費你甚至二進制包括:

  • 壓縮
  • 平臺獨立性
  • 可變內容
  • 改動的內容需要二進制的更新從ASCII

如果你確定執行時間的很大一部分是加載和解析,但你只做一次f或一個固定的數據集,另一個選項可能是使用線程。設置一些加載數據的並行工作人員,然後將其放在隊列中進行分析。

10

將字符串轉換爲數字,但在cpu週期中不便宜,這不是問題。涉及I/O的開銷總是比轉換總量大幾個數量級。文件的大小也不是什麼大問題,一個磁盤提供8KB大約20KB的速度,它全部來自同一磁道上的同一個羣集。有成千上萬的文件是問題,打開一個文件涉及移動磁盤讀取頭,這需要永遠。

因此,請專注於削減文件數量以獲得真正的收益。

+0

+1用於識別真正的風險 - 尋求。 – MSalters 2011-03-28 08:47:45