'拇指规则'打印成本

时间:2016-06-26 00:54:46

标签: java performance

我注意到了

int i=10000000;
boolean isPrime= false;
      while(!isPrime){
           i++;
           System.out.println(item); //this kills performance
           isPrime = checkIfPrime(i);

     }
}

打印变量的当前值会导致性能下降。我想偶尔打印一次,但要保持低操作的成本。

如何将打印成本与屏幕成本进行比较?是否有任何技巧可以最大限度地降低这种成本[我应该打印10条记录中的一条,还是会因为条件检查而花费这么多?]

为什么我需要这个?好吧,我正在用Java做有趣的事情(例如"找到欧拉的结合的反例...... 27 ^ 5 + 84 ^ 5 + 110 ^ 5 + 133 ^ 5 = 144 ^ 5(Lander) & Parkin,1966),")。我想写一个既正确又快速的程序(这个反例是在60年代发现的,所以我应该能够在合理的时间内完成)。在调试时我想拥有尽可能多的信息和可能,我想尽快找到反例。我最好的办法是什么?打印每个案例? - 太慢了。让它一夜之间运行?如果我错过了一些i++怎么办?

7 个答案:

答案 0 :(得分:7)

  

如何将打印成本与屏幕成本进行比较?

这是不可能的。打印的成本(即经过的时间)取决于打印"人物走了。我可以简单地构建一个成本趋于无穷大的例子。

<form:textarea path="emailSubject" name="emailSubject" id="emailSubTxtArea"
                            placeholder="Email Subject"/>

输出几行后,管道缓冲区将填满,应用程序中的 $ java YourClass | ( sleep 10000000000 ) 调用将被阻止。

  

是否有任何技巧可以最大限度地降低这种成本[我应该打印10条记录中的一条,还是会因为条件检查而花费这么多?]

没有什么能够引入另一个开销;例如测试是否打印的开销。

完全消除打印开销的唯一方法是在尝试衡量性能时根本不打印

  

我最好的方法是什么?打印每个案例? - 太慢了。让它一夜之间运行?如果我错过了一些i ++怎么办?

首先使用print语句运行程序,检查您是否得到了正确的答案。

然后删除打印语句并再次运行以获得性能指标。

然而:

  1. 谨防编写Java微基准的各种陷阱。
  2. 浏览网页和跟踪打印页面不是检查程序中(可能的)错误的好方法。

答案 1 :(得分:3)

是打印很贵。处理器可以在打印到终端/ IDE所花费的时间跨度内完成数百万次操作。如果您正在使用eclipse或终端,那么它非常耗时。如果您使用终端您需要使用>>>将其重定向到文件,或使用nioio库将其写入文件。只有在不可避免的情况下打印任何东西,否则我觉得如果性能问题就不应该打印。

答案 2 :(得分:2)

以下是您可以做的最快的计算下一个素数和打印以及您在此过程中测试的所有数字(前提是下一个素数不会导致int溢出):

int i = 10000000;
boolean isPrime = false;
while (!isPrime) {
    i++;
    // System.out.println(item); //this kills performance
    isPrime = checkIfPrime(i);
}
for (int j = 10000001; j <= i; j++) sysout(j);

答案 3 :(得分:2)

如果您需要对代码性能进行基准测试,则无法使用print语句。对于少数迭代,您必须打印,一旦您知道代码正常工作,就进行调试并删除打印语句。然后对代码进行时间测量 否则,如果您希望在代码中始终使用打印语句,则可以决定您可以接受多少延迟。例如,Xeon处理器可以为您提供28-35 Gflops / IOPS(每秒操作数),这意味着处理器每秒可以执行35 * 10 ^ 9增量操作(它可以{35} 10 * i++ 9次/秒)。并根据此(https://stackoverflow.com/a/20683422/3409405)回答System.out.println()大约需要1毫秒。所以这意味着如果你每10 ^ 6 i++打印一次,你的消耗时间就会翻倍。

答案 4 :(得分:1)

  

如何将打印成本与屏幕成本进行比较?

通过测量:实现两种方法(打印每一行,打印每一行x)并查看哪一种更快,并保持调整x以在频繁的状态更新和吞吐量之间进行合理的权衡。

值得注意的是,打印成本会受到打印成本的强烈影响。是缓冲流还是冲洗每个数字?它是写入内存,SSD,普通硬盘还是连接到慢速usb 1端口的某些驱动器?这可以将写入性能改变1000倍,这就是为什么你应该测量你的特定用例。

答案 5 :(得分:1)

这方面的一种方法可能如下:

在一个线程中执行你的任务,该线程用你想输出的东西更新公共缓冲区(字符串?信息类的实例?),但不要在这个线程中执行实际的输出。记住锁定缓冲区,以便您可以安全地从不同的线程访问此信息。

然后,让计时器/其他线程访问此公共缓冲区以打印出该信息。这样就可以将计算与输出分离。缺点是您不会看到每个输出,但在生成输出时,计算仍在继续。

答案 6 :(得分:1)

简短的回答是:它真的取决于。打印文本很昂贵。百#打印我&#34;比使用字符串构建器构建字符串并且烧制&#34; print&#34;一次。