1

我正在研究 groovy 代码性能优化。我使用 jvisualvm 连接到正在运行的应用程序并收集 CPU 样本。样本说org.codehaus.groovy.reflection.CachedMethod.inkove占用的 CPU 时间最多。我在示例中没有看到任何其他应用方法。

深入研究 CachedMethod.invoke并了解哪些代码行真正会导致性能下降的正确方法是什么?

谢谢。

UPD:我确实使用Indy,它对我没有帮助。

我没有尝试引入@CompileStatic,因为我想在将groovy 重写为java 之前找到我的瓶颈。

我的问题有点类似于这个线程:调用站点缓存比调用动态更快?

我有一个动态编写 groovy 脚本的代码。脚本模板看起来是这样的:

def evaluateExpression(Map context){
    def user = context.user
    %s
}

其中%s替换为

user.attr1 == '1' || user.attr2 == '2' || user.attr3 = '3'

从数据库中获取了一组(总共 20 个)替换项。代码从 DB 获取替换,创建 GroovyScript 并评估它。我想瓶颈在于脚本执行。修复它的正确方法是什么?

4

1 回答 1

0

所以,我尝试了各种各样的事情

  1. groovy-indy,不起作用
  2. 带有一些代码“优化”的 groovy-indy 不起作用。顺便说一句,我开始使用 try/catch,结果我的“热点”运行速度提高了 4 倍。我不擅长 JVM 内部,但互联网说 - try/catch 阻止优化。我认为这是一个基本事实。需要更深入地了解它真正起作用的人。
  3. 我放弃了,关闭了 invokedynamic 并用 @CompileStatic 重写了我的“最热门”代码。花了大约 3-4 个小时,我的代码现在运行速度快了 100 倍。

以下是具有“invokedynamic 支持”的初始指标

count = 83043

     mean rate = 395.52 calls/second

 1-minute rate = 555.30 calls/second

 5-minute rate = 217.78 calls/second

15-minute rate = 82.92 calls/second

           min = 0.29 milliseconds

           max = 12.98 milliseconds

          mean = 1.59 milliseconds

        stddev = 1.08 milliseconds

        median = 1.39 milliseconds

          75% <= 2.46 milliseconds

          95% <= 3.14 milliseconds

          98% <= 3.44 milliseconds

          99% <= 3.76 milliseconds

        99.9% <= 12.19 milliseconds

以下是关闭 ind 的 @CompileStatic 指标。顺便说一句,如果打开了“indy”,就没有理由使用@CompileStatic。

 count = 139724

     mean rate = 8950.43 calls/second

 1-minute rate = 2011.54 calls/second

 5-minute rate = 426.96 calls/second

15-minute rate = 143.76 calls/second

           min = 0.02 milliseconds

           max = 24.18 milliseconds

          mean = 0.08 milliseconds

        stddev = 0.72 milliseconds

        median = 0.06 milliseconds

          75% <= 0.08 milliseconds

          95% <= 0.11 milliseconds

          98% <= 0.15 milliseconds

          99% <= 0.20 milliseconds

        99.9% <= 1.27 milliseconds
于 2016-04-18T09:44:41.563 回答