![](/img/trans.png)
[英]What is the absolute fastest way to read and write strings from a file with 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
所做的任何其他事情。 我繼續使用InputStream
和Reader
類的Buffered
版本,因為它們是最佳實踐,應盡可能使用。
對於額外的功勞,壓縮將進一步減少大文件上的 I/O 等待,而對 CPU 時間幾乎沒有可測量的影響。
通常,您可以在磁盤允許的范圍內盡可能快地讀取數據。 更快地閱讀它的最佳方法是使其更緊湊或獲得更快的磁盤。
對於您使用的格式,我會 GZip 文件並讀取壓縮數據。 這是提高讀取基礎數據的速率的簡單方法。
升級可能性:
在獲得更多性能/速度方面總是需要權衡取舍。 上述方法要花錢,而且必須在每台主機上執行,所以如果這是一個出售給多個客戶的程序,那么在算法上玩弄算法可能是一個更好的選擇,這樣可以在每台主機上節省資金,程序運行。
如果壓縮文件或存儲二進制數據,讀取速度會提高,但使用獨立工具檢查數據會更加困難。 當然,我們無法確定這種情況發生的頻率。
在大多數情況下,我建議保留人類可讀的數據,並使用較慢的程序,但當然這取決於你失去了多少時間,你失去它的頻率等等。
也許這只是一個練習,以找出你能跑多快。 但是,我想提醒大家不要習慣於在不考慮權衡和成本的情況下始終達到最高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.