【问题标题】:System.nanoTime for calculating Execution time and Performance ImpactSystem.nanoTime 用于计算执行时间和性能影响
【发布时间】:2016-01-20 21:54:06
【问题描述】:

我使用以下代码来评估我的方法/操作的性能-

问题:由于这涉及到代码,是否应该将其从生产代码中删除以防止降低应用性能。

在我们的一次讨论中,有人指出 Linux(时区)上的一些 Time 调用会执行 IO 来查找 /etc 中的文件。这导致性能评估的加载系统非常缓慢。

           long startTime = System.nanoTime();
            ...  <code> ....
           long estimatedTime = System. nanoTime () - startTime;
           double timeInSeconds = estimatedTime / 1E9;

           print ("Estimated_Time =>" + estimatedTime +
                    ":nano seconds " + timeInSeconds + ":seconds");

【问题讨论】:

  • 配置文件并检查在 nanoTime 中花费了多少时间 - 一次调用通常需要 15-30 ns,这并不多,但如果每次调用方法时都这样做可能会很麻烦...
  • 基于其他cmets,很明显有一个预击,所以我想应该抑制它。只有让我发布这个问题的问题是——如果我们需要在部署代码时调试执行时间怎么办。通过打开跟踪,我们可以看到执行时间,但如果它被抑制,则永远无法分析!
  • 仪器可能是更好的选择。

标签: java performance time


【解决方案1】:

通过使用任何现代 IDE,您可以对所有源代码进行替换,并将 System.nanoTime() 替换为 MyUtils.nanoTime() 之类的静态方法:

private static final boolean PRODUCTION = true; // change to false while development

public static long nanoTime() {
    return PRODUCTION ? 0 : System.nanoTime();
}

这将允许不要从该指标中清除代码,但会减少生产模式下的性能问题。

UPD

这些代码行,如果它们经常重复的话:

       long estimatedTime = System. nanoTime () - startTime;
       double timeInSeconds = estimatedTime / 1E9;

       print ("Estimated_Time =>" + estimatedTime +
                ":nano seconds " + timeInSeconds + ":seconds");

也可以用相同的布尔触发器以相同的方式替换。

【讨论】:

  • 这似乎是个好方法!所以基本上,如果我们让它保持打开状态,就会对性能产生影响..
  • 当然,正如@PeterLawrey 所写的那样
  • 这意味着你的整个应用程序将依赖于那个类。在我看来,这不是一个好的架构。它也在重新发明 java.util.logging.Logger。
  • Logger 不会保护您免受System.nanoTime() 的调用。此外,将所有用户代码更改为使用 Logger 将是非常困难的建议。我们不知道在他的情况下是否可能。顺便说一句,如果您认为我不知道 Logger 是什么,那您就大错特错了 :)
  • 先生们,如果问题有道理,请点赞!谢谢!
【解决方案2】:

System.nanoTime() 的成本约为 35 ns。 YMMV。

将数字连接到字符串的成本要高得多,执行任何类型的系统调用的成本,例如IO 是 2+ 微秒。

把握时机不太可能成为问题,但除非您非常小心地记录这些信息,否则成本可能会高出 100 倍。

【讨论】:

  • 在这种情况下,如果日志级别是跟踪,除非打开跟踪,否则不会造成任何破坏。这意味着,我们可以通过打开跟踪(通常仅用于调试神秘问题)来找出实时生产的估计时间
  • @Rockoder 如果未打开日志记录,您仍然需要确保没有进行任何字符串连接。
  • 现在,我更倾向于完全禁用这些系统调用,也将摆脱打印日志。谢谢你的建议,我想我差点错过了。
  • @Rockoder 你可以做的是创建一个子类,它对超类中的关键方法进行计时。通过这种方式,您可以通过您选择的课程启用或运行无需计时/记录的课程。
  • 我在想,Java 中是否有办法以某种方式检测选择性方法。我们使用一些 -D 标志运行应用程序并要求检测某些方法(不是全部,因为那太多了);这样就不需要更改代码。但这是一个愿望,我不确定这是否可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多