現在、私は100,000 +/-行の入力(例:http://pastebin.com/zhuHLcvA)を読んでいます。これは単一の「;」で終わります。
このコードを使用すると、PCで読み取るのに20秒以上かかります(長すぎます)。
public static String readFromStandardIO() {
String returnValue = "";
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
String userInput;
// System.out.println("Enter polynomials:\n");
while (true) {
userInput = reader.readLine();
// System.out.println(userInput);
returnValue = returnValue.concat(userInput);
if (userInput.equals(";")) {
break;
}
}
} catch (Exception e) {
}
return returnValue;
}
タイミング方法を使用すると、奇妙な結果が得られます。
long start = System.nanoTime();
pol = readFromStandardIO();
long elaspedTime = System.nanoTime() - start;
System.out.println("reading stream took: " + elaspedTime);
そしてそれは出力します:
reading stream took: 1914854722
行の連結によってすべてが遅くなっているようです。
returnValue = returnValue.concat(userInput)
それがなければ、すべてが瞬時に行われます。
連結の速度を向上させるにはどうすればよいですか?
public static String readFromStandardIO() {
StringBuilder returnValue = new StringBuilder(9999999);
try {
BufferedReader reader = new BufferedReader(System.in);
String userInput;
while ((userInput = reader.readLine()) != null) {
returnValue.append(userInput);
}
reader.close();
} catch (Exception e) {
}
return returnValue.toString();
}
または、これははるかに高速です(jdkが* .nioをサポートしている場合):
public static String readFromStandardNIO() {
java.nio.ByteBuffer buffer = java.nio.ByteBuffer.allocate(20480000);
try {
ReadableByteChannel channel = Channels.newChannel(System.in);
channel.read(buffer);
channel.close();
} catch (Exception e) {
}
return new String(buffer.array());
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加