加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:14:26 所属栏目:Java 来源:网络整理
导读:参见英文答案 Do not use System.out.println in server side code????????????????????????????????????9个 我有一个简单的程序,我从我的Java编程书中获得,只是添加了一点. package personal;public class SpeedTest { public static void main(String[] ar
参见英文答案 > 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相关的延迟源延迟.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读