簡體   English   中英

從 Java 中的文件中讀取整數的最快方法是什么?

[英]What would be the fastest way to read integers from a file in Java?

我有一個這樣排列的整數文件:

1 2 3 55 22 11 (and so on)

我想盡可能快地閱讀這些數字,以減少我的程序的總執行時間。 到目前為止,我使用的掃描儀效果很好。 但是,我覺得有一個更快的 IO 實用程序可以使用。 誰能指出我正確的方向?

編輯:

所以是的,我通過在 java 代碼周圍設置不同的計時器並比較結果來驗證我的程序中的 IO 花費的時間最多。

當前文件格式

如果數字表示為Strings ,則沒有更快的方法來讀取和解析它們,磁盤 I/O 將比 CPU 正在執行的任何操作慢幾個數量級。 唯一能做的就是使用具有巨大緩沖區大小的BufferedReader並在使用Scanner之前嘗試獲取 memory 中的盡可能多的文件。

替代文件格式

如果您可以在文件中將它們表示為二進制文件並使用DataInputStream class讀取數字,那么您可能會在 I/O 時間和 CPU 上略有減少,因為您不需要將String表示解析為除非您的輸入文件以數int字節或更大為單位,否則這可能無法測量。 **緩沖輸入 stream 仍然比其他任何東西都具有更大的效果,在這種情況下使用BufferedInputStream

如何優化

您需要強大的分析來檢測您所做的任何更改是否對性能產生了積極消極的影響。

如果你一遍又一遍地讀取同一個文件,操作系統磁盤緩存之類的東西會扭曲基准,操作系統會緩存它並搞砸你的基准。 盡早了解什么是足夠好的

“我們應該忘記小的效率,比如大約 97% 的時間:過早的優化是萬惡之源” - Donald Knuth

Kunth 引用的過早部分是重要的部分,它的意思是:

不要在沒有分析和基准測試的情況下進行優化,以驗證您正在更改的內容實際上是一個瓶頸,並且您可以衡量更改的積極或消極影響。

這是一個快速基准測試,比較讀取相同二進制數集的BufferedInputStream與由BufferedReader支持的Scanner讀取與文本表示相同的數字集,並帶有SPACE分隔符。

結果非常一致:

在配備 8GB RAM 的 Core i3 筆記本電腦上處理 1,000 個號碼

Read binary file in 0001 ms
Read text file in   0041 ms

在配備 8GB RAM 的 Core i3 筆記本電腦上處理 1,000,000 個號碼

Read binary file in 0603 ms
Read text file in   1509 ms

我的 Core i3 筆記本電腦上有 8GB 內存,可以處理 50,000,000 個號碼

Read binary file in 29020 ms
Read text file in   70346 ms

50,000,000 個號碼的文件大小如下:

 48M input.dat
419M input.txt

在數字集變得非常大之前,讀取二進制文件的速度要快得多。 二進制編碼整數上的 I/O 更少(大約 10 倍),沒有String解析邏輯,以及 object 創建的其他開銷以及Scanner所做的任何其他事情。 我繼續使用InputStreamReader類的Buffered版本,因為它們是最佳實踐,應盡可能使用。

對於額外的功勞,壓縮將進一步減少大文件上的 I/O 等待,而對 CPU 時間幾乎沒有可測量的影響。

通常,您可以在磁盤允許的范圍內盡可能快地讀取數據。 更快地閱讀它的最佳方法是使其更緊湊或獲得更快的磁盤。

對於您使用的格式,我會 GZip 文件並讀取壓縮數據。 這是提高讀取基礎數據的速率的簡單方法。

升級可能性:

  • 購買更快的磁盤。
  • 買個ssd驅動。
  • 將文件存儲在 ramdisk 中。

在獲得更多性能/速度方面總是需要權衡取舍。 上述方法要花錢,而且必須在每台主機上執行,所以如果這是一個出售給多個客戶的程序,那么在算法上玩弄算法可能是一個更好的選擇,這樣可以在每台主機上節省資金,程序運行。

如果壓縮文件或存儲二進制數據,讀取速度會提高,但使用獨立工具檢查數據會更加困難。 當然,我們無法確定這種情況發生的頻率。

在大多數情況下,我建議保留人類可讀的數據,並使用較慢的程序,但當然這取決於你失去了多少時間,你失去它的頻率等等。

也許這只是一個練習,以找出你能跑多快。 但是,我想提醒大家不要習慣於在不考慮權衡和成本的情況下始終達到最高性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM