STDINを1行ずつ読み取る最も時間効率の良い方法を探しています。
最初の行は、テストする条件の数です。以下のすべての行は、最大100 000文字の条件(文字列)です。
私はすでに次のことを試しました(4回、90 000文字の結果:
Whileループ付きスキャナー(7255 ms)
Scanner sc = new Scanner(System.in);
int numberOfLines = Integer.parseInt(sc.nextLine());
long start = 0;
int i = 1;
while (i<=numberOfLines){
start = System.currentTimeMillis();
sc.nextLine();
Debug.println((System.currentTimeMillis()-start) + "ms for scanner while");
i++;
}
Forループ付きスキャナー(7078 ms)
Scanner sc = new Scanner(System.in);
int numberOfLines = Integer.parseInt(sc.nextLine());
long start = 0;
for (int i = 1; i<= numberOfLines;i++){
start = System.currentTimeMillis();
sc.nextLine();
Debug.println((System.currentTimeMillis()-start) + "ms for scanner for");
//i++;
}
Forループ付きのBufferedReader(7403ミリ秒)
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int numberOfLines = Integer.parseInt(br.readLine());
long start = 0;
for (int i = 0; i< numberOfLines;i++){
start = System.currentTimeMillis();
br.readLine();
Debug.println((System.currentTimeMillis()-start) + "ms for bufferreader for");
//i++;
}
} catch (Exception e) {
System.err.println("Error:" + e.getMessage());
}
Whileループを備えたBufferedReader(7461 ms)
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int numberOfLines = Integer.parseInt(br.readLine());
int i=0;
long start = 0;
while(i< numberOfLines){
start = System.currentTimeMillis();
br.readLine();
Debug.println((System.currentTimeMillis()-start) + "ms for bufferreader while");
i++;
}
} catch (Exception e) {
System.err.println("Error:" + e.getMessage());
}
かかった時間をデバッグしているときに、読み取りごとに時間がかかっていることに気付きました。初期化されるバイトを制限することは可能ですか(例:最大100.000文字の場合、scanner/bufferedreaderを初期化するのは100 000文字のみに制限します。読み取り後、次の100 000文字でそれ自体を補充する必要があります)
この問題に関するアイデアは大歓迎です。
編集:各シナリオのコードを、1行の読み取りにかかった時間とともに追加しました。また、読みやすくするために100.000を100 000に変更しました。
BufferedReader#readLine
ソース。私が見るいくつかの問題があります:
次の2つのことでチャンスをつかむことができます。