0

私は現在、grails 2.4.2で実行されているgrailsアプリを持っています.

Future<Map<String,Object>> future1 = service.getMetrics(args1)
Future<Map<String,Object>> future2 = service.getMetrics(args2)

Map<String,Object> result1 = future1.get(10, TimeUnit.DAYS.MINUTES)
Map<String,Object> result2 = future2.get(10, TimeUnit.DAYS.MINUTES)

私の目標は、このコードを非同期にリファクタリングすることです。これは、上記のコード スニペットが「ブロッキング」get 関数をすぐに呼び出して非同期プログラミングを使用する目的を無効にしているように見えるためです。次のオプションを検討しています

  1. Grails の約束
  2. グアバの聞き取れる未来
  3. Java 8: 完成可能な未来

私の質問は、どのオプションを検討するかということではありませんが、メトリックを測定して、非ブロッキング呼び出しを使用すると、grails Web アプリケーションにアクセスするユーザーにより良い応答時間が提供されることを示す簡単で簡単な方法があります。

4

1 に答える 1

0

これがあなたの旅行に役立つかどうかはわかりませんが、私はほとんど同じ問題のように聞こえるもので遊んでいました. コードの一部をマルチスレッド化したかどうか、最終的にリクエスト全体の時間を短縮できるかどうかを調べようとしていました。私のメソッドのいくつかの部分は、単に小さすぎてスレッド化の恩恵を受けられませんでした。

これは、メトリクスをテストしているメソッドの上部に貼り付けたコード スニペットへのリンクです。メソッドを調整したら、次のコードを削除します。

https://gist.github.com/mikedehaan/ed2751601046b6d1d078

これにより、メソッドの開始からのタイミングと gotHere() 呼び出し間の時間を出力する gotHere() ステートメントでメソッドを装飾できます。

例:

gotHere("Start Process");

def promise1 = task {
    // Do something that takes time
}

// Do something else while we're waiting for promise1 to finish

// Block until promise1 completes
def result = promise1.get();

gotHere("Process Finished");

これは恒久的なメトリクス ソリューションではありませんが、メソッドのパフォーマンスを調整するのに役立ちました。

お役に立てれば。

于 2016-01-08T01:32:01.067 に答える