2012-02-01 3 views
2

Grailsアプリケーションでのパフォーマンスに取り組んでいます。Grailsはコントローラからサービスに戻るためにはかなりの時間(7-13ms)が必要です。返されるデータは、あまり複雑ではなく、ドメインオブジェクト(2つの参照を持つMap)への参照です。この時間を短縮する方法はありますか?Grailsでのサービスからコントローラへの復帰

サービスでreturn文を実行する前にlog.debug()を呼び出し、サービスを終了した後に別のものをコントローラに用意しました。

2012-02-01 15:16:07,048 [http-8080-1] DEBUG api.TestService test before service return 
2012-02-01 15:16:07,063 [http-8080-1] DEBUG api.TestController test after service return 

編集:Grailsのバージョン1.3.7

編集:HibernateのSQLロギングをオンにした後:

2012-02-02 09:20:04,504 [http-localhost%2F127.0.0.1-8080-1] DEBUG api.TestService before return 
2012-02-02 09:20:04,505 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL select nextval ('hibernate_sequence') 
2012-02-02 09:20:04,516 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL insert into test ... 
2012-02-02 09:20:04,520 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL update test1 ... 
2012-02-02 09:20:04,522 [http-localhost%2F127.0.0.1-8080-1] DEBUG hibernate.SQL insert into test_test1 ... 
2012-02-02 09:20:04,524 [http-localhost%2F127.0.0.1-8080-1] DEBUG api.TestController after service 
+0

デバッガでコードをステップ実行しようとしましたか?それがどこに行くのか見てみましょうか? – cdeszaq

+0

サービスで何をしているのかを情報提供することができますか?マップを持つ要素の数はいくつですか?コードスニペット? – david

+4

真剣に?あなたは約7〜13ミリ秒を懸念していますか? –

答えて

2

オーバーヘッドは、Springがサービス呼び出しの回りにトランザクションコンテキストを構築することによって引き起こされる可能性があります(Grailsのデフォルトはhttp://grails.org/doc/2.0.x/guide/services.html#declarativeTransactionsを参照)。あなたのサービスは、(データベース)トランザクションを必要としない場合 、あなたがサービスに

static transactional = false 

を追加してください。

トランザクションが必要で、コントローラから多くのサービスコールを行っている場合は、処理するトランザクションの量が最小になるようにサービスに移動する価値があります。 (コントローラにそれらを保持しておきたい場合は、トランザクションブロックを使用して1回のトランザクションで複数のサービス呼び出しを行うことができます)。

+0

あなたは正しいです。私たちが気づいたログをいくつか追加した後、サービスを終了するとトランザクションが終了し、挿入と更新が長く続きます。私は、ハイバネートSQLデバッグをオンにした後、ログを使って質問を編集しました。 – Maciej

2

7〜13ミリ秒をほとんど瞬間的です。これをさらに減らすために時間を無駄にしています。確かにあなたはもっと重要なことをする必要がありますか?

サービスとの間で実行するよりGrails/Springコード(あなたのものではない)のため、実際に何もすることができないので、時間を費やしてもほとんど問題はありません。コントローラ。

+0

あるメソッドから別のメソッドに戻るのに7から13ミリ秒かかると言っていますか? 7〜13ミリ秒かかるサービス呼び出しからコントローラへのAPI呼び出しではありません。したがって、SLAを満たすためには、これは調べるべき事項の1つです。 – Krystian

+1

ミリ秒のパフォーマンスが懸念される場合は、細かく調整されたアセンブリ言語でアプリケーションをコーディングする必要があります。 –

+0

バート、私は同意しません。私はあなたが極端なものからパフォーマンスに関わらず別のものになると思っています[演奏は王様です。] Grailsとしてフレキシブルなものを書いて、私たちができる限り多くのことをしています。そうすることで、我々は微調整が容易なボトルネックを探しています[例えば、長いループをJavaに動かすなど]。私たちは、サービスからコントローラへの単純な復帰で、いくつかのapiの1/4時間を失っていることを発見しました。理由を見つけることができなかったので、私たちは尋ねることにしました。これは間違っているのでしょうか?それは10人のユーザーのWebアプリケーションでしたが、そうではありません。 – Krystian

関連する問題