Investigate clover-report performance improvements

XMLWordPrintable

    • Type: Suggestion
    • Resolution: Fixed
    • 2.5
    • Component/s: Reporting
    • None

      com.cenqua.clover.CoverageData$TestHits.getSlicesFor

      In some extreme cases, (> 10K test cases), clover-report can take a very long time to run.

      Investigate possibilities of optimizing the crunching of clover's per-test coverage data.

      Below is a thread dump of a slow clover-report:

      Full thread dump Java HotSpot(TM) 64-Bit Server VM (1.5.0_06-b05 mixed
      mode):
      
      "Clover-Thread-118" prio=1 tid=0x0000002be6f4c7c0 nid=0x5176 runnable
      [0x0000000041060000..0x0000000041060d30]
             at java.util.BitSet.nextSetBit(BitSet.java:563)
             at
      com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3
      30)
             at
      com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144)
             at
      com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176)
             at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source)
             at
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
      Impl.java:25)
             at java.lang.reflect.Method.invoke(Method.java:585)
             at
      clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp
      l.invoke(UberspectImpl.java:295)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth
      od.java:245)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR
      eference.java:203)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef
      erence.java:419)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx
      pression.java:73)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS
      TSetDirective.java:125)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST
      IfStatement.java:88)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java
      :448)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi
      rective.java:170)
             at
      clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN
      ode.java:318)
             at clover.org.apache.velocity.Template.merge(Template.java:254)
             at
      clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi
      ne.java:508)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:67)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:83)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio
      n.java:136)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction.
      java:104)
             at
      com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut
      ors.java:88)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut
      ureTask.java:176)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      .runWorker(ThreadPoolExecutor.java:987)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      $Worker.run(ThreadPoolExecutor.java:528)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp
      ers$1.run(ThreadHelpers.java:34)
             at java.lang.Thread.run(Thread.java:595)
      
      "Clover-Thread-117" prio=1 tid=0x0000002be38ccff0 nid=0x5175 runnable
      [0x0000000041464000..0x0000000041464cb0]
             at java.util.BitSet.nextSetBit(BitSet.java:563)
             at
      com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3
      30)
             at
      com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144)
             at
      com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176)
             at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source)
             at
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
      Impl.java:25)
             at java.lang.reflect.Method.invoke(Method.java:585)
             at
      clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp
      l.invoke(UberspectImpl.java:295)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth
      od.java:245)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR
      eference.java:203)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef
      erence.java:419)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx
      pression.java:73)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS
      TSetDirective.java:125)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST
      IfStatement.java:88)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java
      :448)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi
      rective.java:170)
             at
      clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN
      ode.java:318)
             at clover.org.apache.velocity.Template.merge(Template.java:254)
             at
      clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi
      ne.java:508)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:67)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:83)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio
      n.java:136)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction.
      java:104)
             at
      com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut
      ors.java:88)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut
      ureTask.java:176)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      .runWorker(ThreadPoolExecutor.java:987)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      $Worker.run(ThreadPoolExecutor.java:528)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp
      ers$1.run(ThreadHelpers.java:34)
             at java.lang.Thread.run(Thread.java:595)
      
      "Clover-Thread-116" prio=1 tid=0x0000002be65a3c90 nid=0x5174 runnable
      [0x0000000041565000..0x0000000041565c30]
             at java.util.BitSet.nextSetBit(BitSet.java:563)
             at
      com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3
      30)
             at
      com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144)
             at
      com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.insertSrcFilePropertie
      s(RenderFileAction.java:174)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio
      n.java:122)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction.
      java:104)
             at
      com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut
      ors.java:88)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut
      ureTask.java:176)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      .runWorker(ThreadPoolExecutor.java:987)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      $Worker.run(ThreadPoolExecutor.java:528)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp
      ers$1.run(ThreadHelpers.java:34)
             at java.lang.Thread.run(Thread.java:595)
      
      "Clover-Thread-115" prio=1 tid=0x0000002be43ce670 nid=0x5173 runnable
      [0x0000000041867000..0x0000000041868bb0]
             at java.util.BitSet.nextSetBit(BitSet.java:563)
             at
      com.cenqua.clover.CoverageData$TestHits.getSlicesFor(CoverageData.java:3
      30)
             at
      com.cenqua.clover.CoverageData.getTestCasesFor(CoverageData.java:144)
             at
      com.cenqua.clover.CloverDatabase.getTestHits(CloverDatabase.java:176)
             at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source)
             at
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
      Impl.java:25)
             at java.lang.reflect.Method.invoke(Method.java:585)
             at
      clover.org.apache.velocity.util.introspection.UberspectImpl$VelMethodImp
      l.invoke(UberspectImpl.java:295)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMeth
      od.java:245)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTR
      eference.java:203)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTReference.value(ASTRef
      erence.java:419)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTEx
      pression.java:73)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTSetDirective.render(AS
      TSetDirective.java:125)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTIfStatement.render(AST
      IfStatement.java:88)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.
      java:74)
             at
      clover.org.apache.velocity.runtime.directive.Foreach.render(Foreach.java
      :448)
             at
      clover.org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDi
      rective.java:170)
             at
      clover.org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleN
      ode.java:318)
             at clover.org.apache.velocity.Template.merge(Template.java:254)
             at
      clover.org.apache.velocity.app.VelocityEngine.mergeTemplate(VelocityEngi
      ne.java:508)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:67)
             at
      com.cenqua.clover.reporters.html.HtmlReportUtil.mergeTemplateToFile(Html
      ReportUtil.java:83)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.render(RenderFileActio
      n.java:136)
             at
      com.cenqua.clover.reporters.html.RenderFileAction.call(RenderFileAction.
      java:104)
             at
      com.cenqua.clover.util.CloverExecutors$LoggingCallable.call(CloverExecut
      ors.java:88)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.FutureTask.run(Fut
      ureTask.java:176)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      .runWorker(ThreadPoolExecutor.java:987)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      $Worker.run(ThreadPoolExecutor.java:528)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.helpers.ThreadHelp
      ers$1.run(ThreadHelpers.java:34)
             at java.lang.Thread.run(Thread.java:595)
      
      "Java2D Disposer" daemon prio=1 tid=0x0000002be46dfec0 nid=0x5170 in
      Object.wait() [0x0000000041e6e000..0x0000000041e6eb30]
             at java.lang.Object.wait(Native Method)
             - waiting on <0x0000002b5646cd28> (a
      java.lang.ref.ReferenceQueue$Lock)
             at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
             - locked <0x0000002b5646cd28> (a
      java.lang.ref.ReferenceQueue$Lock)
             at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
             at sun.java2d.Disposer.run(Disposer.java:107)
             at java.lang.Thread.run(Thread.java:595)
      
      "Low Memory Detector" daemon prio=1 tid=0x0000002be051ac60 nid=0x7a9c
      runnable [0x0000000000000000..0x0000000000000000]
      
      "CompilerThread1" daemon prio=1 tid=0x0000002be05190d0 nid=0x7a9b
      waiting on condition [0x0000000000000000..0x0000000040c5b560]
      
      "CompilerThread0" daemon prio=1 tid=0x0000002be0517bc0 nid=0x7a9a
      waiting on condition [0x0000000000000000..0x0000000040b5a500]
      
      "AdapterThread" daemon prio=1 tid=0x0000002be0516500 nid=0x7a99 waiting
      on condition [0x0000000000000000..0x0000000000000000]
      
      "Signal Dispatcher" daemon prio=1 tid=0x0000002be05093a0 nid=0x7a98
      waiting on condition [0x0000000000000000..0x0000000000000000]
      
      "Finalizer" daemon prio=1 tid=0x0000002be0500f80 nid=0x7a97 in
      Object.wait() [0x0000000040858000..0x0000000040858e30]
             at java.lang.Object.wait(Native Method)
             - waiting on <0x0000002adfc9a490> (a
      java.lang.ref.ReferenceQueue$Lock)
             at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
             - locked <0x0000002adfc9a490> (a
      java.lang.ref.ReferenceQueue$Lock)
             at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
             at
      java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
      
      "Reference Handler" daemon prio=1 tid=0x0000002be0500730 nid=0x7a96 in
      Object.wait() [0x0000000040757000..0x0000000040757db0]
             at java.lang.Object.wait(Native Method)
             - waiting on <0x0000002adf680588> (a
      java.lang.ref.Reference$Lock)
             at java.lang.Object.wait(Object.java:474)
             at
      java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
             - locked <0x0000002adf680588> (a java.lang.ref.Reference$Lock)
      
      "main" prio=1 tid=0x0000000040115bb0 nid=0x7a8f in Object.wait()
      [0x0000007fbfffc000..0x0000007fbfffd150]
             at java.lang.Object.wait(Native Method)
             - waiting on <0x0000002b77b68eb0> (a
      clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar)
             at java.lang.Object.wait(Object.java:432)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.TimeUnit.timedWait
      (TimeUnit.java:364)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar.awai
      t(CondVar.java:99)
             - locked <0x0000002b77b68eb0> (a
      clover.edu.emory.mathcs.backport.java.util.concurrent.locks.CondVar)
             at
      clover.edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor
      .awaitTermination(ThreadPoolExecutor.java:1305)
             at
      com.cenqua.clover.util.CloverExecutors$CloverExecutorService.awaitTermin
      ation(CloverExecutors.java:64)
             at
      com.cenqua.clover.reporters.html.FullHtmlReporter.createCurrentReportImp
      l(FullHtmlReporter.java:348)
             at
      com.cenqua.clover.reporters.html.HtmlReporter.createCurrentReport(HtmlRe
      porter.java:106)
             at
      com.cenqua.clover.reporters.html.HtmlReporter.generateCurrentReport(Html
      Reporter.java:75)
             at
      com.cenqua.clover.reporters.html.HtmlReporter.generateReport(HtmlReporte
      r.java:64)
             at
      com.cenqua.clover.reporters.CloverReporter.generateReport(CloverReporter
      .java:30)
             at
      com.cenqua.clover.tasks.CloverReportTask.generateReports(CloverReportTas
      k.java:408)
             at
      com.cenqua.clover.tasks.CloverReportTask.cloverExecute(CloverReportTask.
      java:369)
             at
      com.cenqua.clover.tasks.AbstractCloverTask.execute(AbstractCloverTask.ja
      va:47)
             at
      org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
             at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
             at
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor
      Impl.java:25)
             at java.lang.reflect.Method.invoke(Method.java:585)
             at
      org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:1
      06)
             at org.apache.tools.ant.Task.perform(Task.java:348)
             at org.apache.tools.ant.Target.execute(Target.java:357)
             at org.apache.tools.ant.Target.performTasks(Target.java:385)
             at
      org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
             at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
             at
      org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecut
      or.java:41)
             at
      org.apache.tools.ant.Project.executeTargets(Project.java:1189)
             at org.apache.tools.ant.Main.runBuild(Main.java:758)
             at org.apache.tools.ant.Main.startAnt(Main.java:217)
             at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
             at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
      
      "VM Thread" prio=1 tid=0x0000002be04fc3b0 nid=0x7a95 runnable
      
      "GC task thread#0 (ParallelGC)" prio=1 tid=0x0000000040133770 nid=0x7a91
      runnable
      
      "GC task thread#1 (ParallelGC)" prio=1 tid=0x0000000040134560 nid=0x7a92
      runnable
      
      "GC task thread#2 (ParallelGC)" prio=1 tid=0x0000000040135350 nid=0x7a93
      runnable
      
      "GC task thread#3 (ParallelGC)" prio=1 tid=0x0000000040136140 nid=0x7a94
      runnable
      
      "VM Periodic Task Thread" prio=1 tid=0x0000002be051c810 nid=0x7a9d
      waiting on condition
      
      

            Assignee:
            Unassigned
            Reporter:
            Nick
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: