首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >逐行读取STDIN的最快方法?

逐行读取STDIN的最快方法?
EN

Stack Overflow用户
提问于 2012-01-26 03:22:33
回答 1查看 50.1K关注 0票数 20

我正在寻找一种最省时的逐行阅读STDIN的方法。

第一行是要测试的条件数。以下所有行都是最多100000个字符的条件(字符串)。

我已经尝试了以下几种方法(加上4次90,000个字符的结果:

带while循环的

  • 扫描仪(7255毫秒)

扫描仪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++;}

代码语言:javascript
运行
复制
- Results : 
    1. 3228ms for scanner while
    2. 2264ms for scanner while
    3. 1309ms for scanner while
    4. 454ms for scanner while

带for循环的

  • 扫描仪(7078毫秒)

扫描仪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++;}

代码语言:javascript
运行
复制
- Results : 
    1. 3168ms for scanner for
    2. 2207ms for scanner for
    3. 1236ms for scanner for
    4. 467ms for scanner for

带for循环的

  • BufferedReader (7403 ms)

尝试{ 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());

}

代码语言:javascript
运行
复制
- Results : 
    1. 3273ms for bufferreader for
    2. 2330ms for bufferreader for
    3. 1293ms for bufferreader for
    4. 507ms for bufferreader for

使用while循环的

  • BufferedReader (7461ms)

尝试{ 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());

}

代码语言:javascript
运行
复制
- 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,以使阅读更容易。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-26 04:36:23

查看了BufferedReader#readLine源代码内部。我看到了几个问题:

  1. 它使用StringBuffer而不是StringBuilder,这会产生同步开销。
  2. 似乎还存在数据复制开销-不完全确定,最好检查一下。
  3. BufferedReader中的专用监视器对象和更多的同步开销。

你可以用两件事来碰碰运气:

  1. 编写自己的缓冲,这可以节省一些时间,因为双拷贝data.
  2. Writing你自己的nextLine方法将使用StringBuilder并通过简单的循环遍历源数据。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9008883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档