我正在寻找最节省时间的方式逐行阅读STDIN。
第一行是要测试的条件数。
以下所有行都是条件(字符串),最多为10万个字符。
我已经尝试了以下(加上4次90 000个字符的结果:
>带有循环(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++;
}
>结果:
> 3228ms扫描仪
> 2264ms的扫描仪
> 1309ms扫描仪
>扫描器时为454ms
>带循环的扫描仪(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++;
}
>结果:
> 3168ms用于扫描仪
> 2207ms用于扫描仪
> 1236ms的扫描仪
> 467ms的扫描仪
>带循环的BufferedReader(7403 ms)
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());
}
>结果:
> 3273ms用于缓冲读取器
> 2330ms用于缓冲读取器
> 1293ms用于缓冲读取器
> 507ms用于缓冲读取器
> BufferedReader与while循环(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());
}
>结果:
>缓冲读取器的3296ms
> 2358ms缓冲读取器while
>缓冲读取器的时间> 1307ms
>缓冲读取器> 500ms
在调试所花费的时间时,我注意到每次读取后的时间减少。
是否可以限制被初始化的字节(f.e.:如果最大值为100.000个字符,则限制扫描器/缓冲读取器仅初始化100 000个字符,读取后将需要重新填充自己的下一个100 000个字符)
关于这个问题的任何想法都是值得欢迎的。
编辑:添加每个场景的代码以及每行读取的时间。也更改了100.000到100 000阅读更容易。