2

我正在尝试使用 JRuby 的内置分析器来分析应用程序。

大部分时间都被占用了ClassIsOfInterest.method_that_is_of_interest,而后者又占用了大部分时间Thread#initialize并且Thread#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_interest都会创建 30 个线程,这可能是矫枉过正,但我​​认为它不应该降低性能。当我每次调用只创建三个线程时,我得到了

 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因为它没有做任何其他工作。我不会太担心——配置文件只是说你的一个线程阻塞了其他线程正在做的事情。在这种情况下,更好的性能测量是总运行时间,使用不同数量的线程运行代码并查看最佳点在哪里。

Thread.new/出现的原因Thread#initialize是线程是创建昂贵的对象。如果您经常调用此方法并且每次我建议您查看 Java 的Executors API 时都会创建所有这些线程。一次创建一个线程池Executors(当您的应用程序启动时)并将所有任务提交到池中而不是创建新线程(您可以使用ExecutorCompletionService等待所有任务完成,或者只调用您提交时获得#get的实例FutureTask你的任务)。

于 2013-02-23T20:55:09.907 回答