参见英文答案 >
Do not use System.out.println in server side code 9个
我有一个简单的程序,我从我的Java编程书中获得,只是添加了一点.
我有一个简单的程序,我从我的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相关的延迟源延迟.