【问题标题】:Optimizing Groovy Performance优化 Groovy 性能
【发布时间】:2016-04-09 18:37:04
【问题描述】:

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

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

谢谢。

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

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

我的问题有点类似于这个帖子:Call site caching faster than invokedynamic?

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

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

其中 %s 替换为

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

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

【问题讨论】:

  • 你在使用 Indy 神器吗?
  • 嗨,在提交问题后确实用 Indy 替换了默认的 groovy。根据 newrelic 指标,不能说它有很大帮助。现在顶级 CPU 使用者是 org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.doCallSiteTargetSet 我假设我确实成功地切换到了 InvokeDynamic。我现在应该如何处理 Selector$MethodSelector.doCallSiteTargetSet :) ?
  • @CompileStatic 怎么样?
  • 我想避免随机重写代码以使其成为 @CompileStatic。我想在做一些严肃的事情之前找到瓶颈......

标签: performance groovy cpu invokedynamic


【解决方案1】:

所以,我尝试了各种方法

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

这里是带有“invokedynamic support”的初始指标

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2016-05-14
    • 2011-10-17
    • 2014-01-08
    • 1970-01-01
    • 2017-06-02
    • 2013-03-31
    • 2018-07-19
    相关资源
    最近更新 更多