作者:编舞木煜率_841 | 来源:互联网 | 2023-06-03 11:56
参见英文答案 > Do not use System.out.println in server side code       
参见英文答案 > 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相关的延迟源延迟.