1

Groovy コードのパフォーマンスの最適化に取り組んでいます。jvisualvm を使用して実行中のアプリケーションに接続し、CPU サンプルを収集しました。サンプルによると、org.codehaus.groovy.reflection.CachedMethod.inkoveが最も CPU 時間を消費します。サンプルに他の適用方法はありません。

CachedMethod.invokeを掘り下げて、どのコード行が実際にパフォーマンスのペナルティを与えるかを理解する正しい方法は何ですか?

ありがとう。

UPD : 私はIndyを使用していますが、役に立ちませんでした。

groovy を Java に書き換える前にボトルネックを見つけたいので、@CompileStaticを導入しようとしませんでした。

このスレッドに少し似た私の問題: Call site caching 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 を作成して評価します。ボトルネックはスクリプトの実行にあると思います。それを修正する正しい方法は何ですか?

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 に答える