2

JRubyの組み込みプロファイラーを使用してアプリケーションをプロファイリングしようとしています。

ほとんどの時間が取り込まれClassIsOfInterest.method_that_is_of_interest、そのほとんどの時間が取り込まれThread#initializeThread#join

     total        self    children       calls  method
----------------------------------------------------------------
     31.36        0.02       31.35        4525  Array#each
     31.06        0.00       31.06           2  Test::Unit::RunCount.run_once
     31.06        0.00       31.06           1  Test::Unit::RunCount.run
     31.06        0.00       31.06           1  MiniTest::Unit#run
     31.06        0.00       31.05           1  MiniTest::Unit#_run
     31.01        0.00       31.01        2219  Kernel.send
     31.00        0.00       31.00           1  MiniTest::Unit#run_tests
     31.00        0.00       31.00           1  MiniTest::Unit#_run_anything
     30.99        0.00       30.99           1  Test::Unit::Runner#_run_suites
     30.99        0.00       30.99           5  MiniTest::Unit#_run_suite
     30.99        0.00       30.98       21629  Array#map
     30.98        0.00       30.98           1  Test::Unit::TestCase#run
     30.98        0.00       30.98           1  MiniTest::Unit::TestCase#run
     30.98        0.00       30.98         659  BasicObject#__send__
     30.98        0.00       30.98           1  MyTestClass#my_test_method
     30.80        0.00       30.80          18  Enumerable.each_with_index
     30.77        0.00       30.77          15  MyTestHelper.generate_call_parser_based_on_barcoded_sequence
     30.26        0.00       30.25        4943  Class#new_proxy
     26.13        0.00       26.13          15  MyProductionClass1#my_production_method1

<snip boring methods with zero self time>

     24.27        0.00       24.27          15  ClassIsOfInterest.method_that_is_of_interest
     13.71        0.01       13.71         541  Enumerable.map
     13.48        0.86       12.63          30  Range#each
     12.62        0.22       12.41         450  Thread.new
     12.41       12.41        0.00         450  Thread#initialize
     10.78       10.78        0.00         450  Thread#join
      4.03        0.12        3.91         539  Kernel.require
      3.34        0.00        3.34         248  Kernel.require
      2.49        0.00        2.49          15  MyTestFixture.create_fixture

<snip boring methods with small total times>

を呼び出すたびにClassIsOfInterest.method_that_is_of_interest30のスレッドが作成されますが、これはおそらくやり過ぎですが、パフォーマンスをそれほど低下させることはないと思います。呼び出しごとに3つのスレッドしか作成されなかった場合、

 23.16        0.00       23.15          15  ClassIsOfInterest.method_that_is_of_interest
 22.73       22.73        0.00          45  Thread#join
  4.18        0.08        4.10         539  Kernel.require
  3.56        0.00        3.56         248  Kernel.require
  2.78        0.00        2.78          15  MyTestFixture.create_fixture

Thread#initialize(最初のプロファイルの)の時間値が大きくThread#join、スレッド化を担当するコードに時間がかかっていることを示していますか、それとも単にスレッド内で実行されるコードに時間がかかっていることを示していますか?

4

1 に答える 1

1

表示される理由Thread#joinは、メイン スレッドが他のスレッドの終了を待機するのに多くの時間を費やしているためです。で費やされる時間のほとんどは、他の作業を行っていないため、method_that_is_of_interestブロックに費やされます。Thread#join私はそれについてあまり心配しません.プロファイルは、あなたのスレッドの1つが他のスレッドが行っていることをブロックしていると言っているだけです. この場合のより良いパフォーマンス測定は、合計実行時間であり、さまざまな数のスレッドでコードを実行し、スイート スポットがどこにあるかを確認します。

Thread.new/が表示される理由Thread#initializeは、スレッドは作成するのにコストがかかるオブジェクトだからです。このメソッドを頻繁に呼び出していて、そのたびにすべてのスレッドが作成される場合は、Java のExecutors API を調べることをお勧めします。Executors一度 (アプリケーションの起動時) にスレッド プールを作成し、新しいスレッドを作成する代わりにすべてのタスクをプールに送信します ( ExecutorCompletionServiceを使用してすべてのタスクが完了するのを待つか、送信時に取得#getしたFutureTaskインスタンスを呼び出すだけですあなたのタスク)。

于 2013-02-23T20:55:09.907 に答える