微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – System.out.print导致延迟?

参见英文答案 > Do not use System.out.println in server side code                                    9个
我有一个简单的程序,我从我的Java编程书中获得,只是添加了一点.

package personal;

public class SpeedTest {
  public static void main(String[] args) {
    double DELAY = 5000;
    long startTime = System.currentTimeMillis();
    long endTime = (long)(startTime + DELAY);
    long index = 0;

    while (true) {
      double x = Math.sqrt(index);
      long Now = System.currentTimeMillis();
      if (Now >= endTime) {
        break;
      }
      index++;
    }
    System.out.println(index + " loops in " + (DELAY / 1000) + " seconds.");
  }
}

这将在5.0秒内返回128478180个循环.

如果我添加System.out.println(x);在if语句之前,那么我在5秒内的循环次数下降到400,000s,这是由于System.out.println()中的延迟吗?或者只是在我没有打印出来的时候没有计算x?

解决方法

任何时候你在一个非常繁忙的循环中“输出”,无论使用任何编程语言,你都会引入两个可能非常重要的延迟:

>必须将数据转换为可打印字符,然后写入它可能要显示的任何显示/设备……并且……
>“输出任何东西的行为”迫使该过程与任何可能也产生输出的任何其他过程同步.

通常用于此目的的一种替代策略是“跟踪表”.这是一个内存数组,有一些固定大小,包含字符串.条目以“循环”方式添加到此表中:最旧的条目不断被最新条目替换.该策略提供历史而不需要输出. (剩下的唯一要求是,任何向表中添加条目或从中读取条目的人必须同步其活动,例如使用互斥锁.)

希望显示跟踪表内容的进程应该获取互斥锁,制作感兴趣内容的内存副本,然后在准备输出之前释放互斥锁.通过这种方式,为跟踪表提供条目的各种进程不会被I / O相关的延迟源延迟.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐