我正在寻找最省时的方式逐行读取STDIN。
第一行是要测试的条件数。
以下所有行都是条件(字符串),最多100000个字符。
我已经尝试了以下方法(加上4次90 000个字符的结果:
带while循环的
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++;
}
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++;
}
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循环的
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个字符,请将扫描器/缓冲读取器限制为仅初始化100 000个字符。读取后,需要用接下来的100 000个字符重新填充自身)
关于此事的任何想法都值得欢迎。
编辑:添加了每种情况下的代码以及每行读取所花费的时间。也将100.000更改为100000以更容易阅读。
最佳答案
在BufferedReader#readLine
源代码中查找。我看到几个问题:
您可能会碰到两件事: