簡體   English   中英

當性能受到關注時,如何從文件中讀取整數?

[英]How to read integers from a file when performance is a concern?

我在CodeEval上做了一些任務。 基本上任務很簡單:“打印出從文件中讀取的所有整數的總和”。

我的解決方案如下:

import java.io.File;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;

public class SumIntegersFromFile {

    public static void main(String args[]) throws IOException{

        File file = new File(args[0]);
         BufferedReader br = new BufferedReader( new FileReader(file));
         String line;
         int i=0;
         while((line=br.readLine())!=null){
            int k = Integer.parseInt(line);
             i+=k;
         }
         br.close();
         System.out.println(i);
    }
}

但我被告知,從性能的角度來看,這種解決方案並不是最優的。

該代碼基於問題中的建議最佳方式來閱讀文本文件 這里唯一的區別是我正在讀取整數而不是字符串。

從Java中的文件讀取整數的最高性能效率的方法是什么?

除非您已明確告知其他情況,否則您不應該假設總數將適合int 嘗試將i的類型更改為long ,甚至是BigInteger ,並查看這是否會對您的分數產生影響。

您可以嘗試使用k (並使用Long.parseLong(line) )執行相同操作。 這取決於問題的確切措辭,但也許個別值也可能超過int的限制。

還有一件事......正如你所說的那樣,問題只是說你應該總結所有的整數。 這樣就有可能存在不是整數的行,在這種情況下你應該跳過它們,而不是拋出NumberFormatException (這是你的代碼目前會做的)。

(據說你被告知每行一個條目......)

但是如果你想要擠出最后一點性能,你需要將文件讀取為二進制而不是逐行:將每一行轉換為String太昂貴了。 有關如何執行此操作的詳細說明可以在此問題中找到有關從文本文件求和整數的問題

我認為代碼的性能沒有任何問題。 也就是說,我對你的程序有任何問題的說法提出質疑。

從文件或網絡中讀取數據比操作內存中的數據慢幾個數量級。 因此,將I / O與內存中的數據操作混合的代碼的性能通常由I / O所花費的時間決定。 調整內存中數據的操作很少值得。 如果I / O操作與數據操作同時發生(如果O / S執行一些預讀就會出現這種情況),數據操作幾乎是免費的:使數據操作更快不會減少所需的時間數據操作的CPU時間的減少將被程序在等待輸入時阻塞的時間量的增加精確地抵消。

執行I / O並需要良好性能的程序必須減少等待I / O所花費的時間。 它們的運行方式應使其能夠利用硬件和操作系統提供的優化來減少阻塞量。

重要的是,在較低級別,磁盤和網絡不會為每個操作以少量字節操作。 他們使用更大的數據包或塊。 與操作系統交互以讀取比存儲在一個磁盤塊中更少的字節是浪費的。 程序通過緩沖其I / O來避免這樣做,因此程序本身會將許多小I / O操作的序列更改為更少但更大的操作。 您正在使用BufferedReader ,因此您已經這樣做了。

操作系統可能會做一些預讀:如果你在文件開頭的塊中詢問字節,它會猜測你可能會按順序讀取文件,所以它也值得提取該文件的一些后續塊,預計您的程序也需要這些塊。 順序讀取文件可提供更好的性能 你已經這樣做了。

暫無
暫無

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

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