我正在寻找一种最省时的逐行阅读STDIN的方法。
第一行是要测试的条件数。以下所有行都是最多100000个字符的条件(字符串)。
我已经尝试了以下几种方法(加上4次90,000个字符的结果:
带while循环的
扫描仪sc =新扫描仪(System.in);int numberOfLines = Integer.parseInt(sc.nextLine());long start = 0;int i= 1;while (i<=numberOfLines){ start = System.currentTimeMillis();sc.nextLine();System.in+ "ms for scanner while");i++;}
- Results :
1. 3228ms for scanner while
2. 2264ms for scanner while
3. 1309ms for scanner while
4. 454ms for scanner while
带for循环的
扫描仪sc =新扫描仪(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++;}
- Results :
1. 3168ms for scanner for
2. 2207ms for scanner for
3. 1236ms for scanner for
4. 467ms for scanner for
带for循环的
尝试{ BufferedReader br =新开始(新InputStreamReader(System.in));int numberOfLines = Integer.parseInt(br.readLine());long start = 0;for (int i= 0;i< numberOfLines;i++){ start = System.currentTimeMillis();br.readLine();try + "ms for bufferreader for");//i++;}} catch (Exception e) { System.err.println("Error:“+ e.getMessage());
}
- Results :
1. 3273ms for bufferreader for
2. 2330ms for bufferreader for
3. 1293ms for bufferreader for
4. 507ms for bufferreader for
使用while循环的
尝试{ BufferedReader br =新开始(新InputStreamReader(System.in));int numberOfLines = Integer.parseInt(br.readLine());int i=0;long start = 0;while(i< numberOfLines){ System.currentTimeMillis= System.currentTimeMillis();br.readLine();i<+ "ms for bufferreader while");i++;}} catch (Exception e) { System.err.println("Error:“+ e.getMessage());
}
- Results :
1. 3296ms for bufferreader while
2. 2358ms for bufferreader while
3. 1307ms for bufferreader while
4. 500ms for bufferreader while
在调试所用的时间时,我注意到每次读取后所用的时间都会减少。是否可以限制初始化的字节数(f.e.:如果您最多有100.000个字符,请将扫描仪/缓冲阅读器限制为仅初始化100000个字符。在读取之后,它将需要用下一个100,000个字符来重新填充自己)
关于这个问题的任何想法都是非常受欢迎的。
编辑:添加了每个场景的代码以及读取每行所需的时间。也将100.000更改为100000,以使阅读更容易。
发布于 2012-01-26 04:36:23
查看了BufferedReader#readLine源代码内部。我看到了几个问题:
你可以用两件事来碰碰运气:
https://stackoverflow.com/questions/9008883
复制相似问题