JasperReports比Birt快10倍吗?

时间:2013-07-29 08:24:27

标签: java performance jasper-reports birt

我正在评估 JasperReports Birt 报告引擎。

我在两个工具中设计了一个简单的报告,我将20个值作为参数提供给报告,并从报告中的SQL选择中填充6个其他值作为详细关系(这意味着我有很多行)。 /> 我在 Java PDF 导出中创建了两个报告(我认为两个报告引擎都使用 iText ) 我测量了每份报告所需的时间。报告完全相同,它们是从同一个过程运行的 该报告针对10组价值运行。所以我测量了10个报告中每个报告的时间。结果是:

打印Jasper报告 10个值。测量所需的时间。 110 109 141 125 110 125 110 125 109 110 Jasper完成了!!!

打印Birt报告 10个值。测量所需的时间。 1063 1017 1095 1079 1063 1079 1048 1064 1079 1080 Birt Finished !!!

数字是msecs。

Jasper是否有可能比Birt快10倍。我的代码做错了什么会减慢Birt的速度?我发布了我在每种情况下使用的代码:

JasperReports的:

// Export Jasper report
long startTime = System.currentTimeMillis();
JasperPrint myJasperPrint;
JRExporter myJRExporter = new net.sf.jasperreports.engine.export.JRPdfExporter();
try {
    myJRExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "C:/Workspace/myProject/jasperReport" + reportNr + ".pdf");
    myJasperPrint = JasperFillManager.fillReport("C:/Workspace/myProject/reports/testReport.jasper", jasperParametersMap, connection);
    myJRExporter.setParameter(JRExporterParameter.JASPER_PRINT, myJasperPrint);
    myJRExporter.exportReport();
    return (System.currentTimeMillis() - startTime);
} catch (JRException ex) {
    System.out.println(ex);
}

伯特:

// Export Birt report
String format = HTMLRenderOption.OUTPUT_FORMAT_PDF;
EngineConfig config = new EngineConfig();
config.setEngineHome("C:\\Tools\\Eclipse\\plugins\\org.eclipse.birt.report.viewer_4.2.2.v201302041142\\birt");
HTMLEmitterConfig hc = new HTMLEmitterConfig();
HTMLCompleteImageHandler imageHandler = new HTMLCompleteImageHandler();
hc.setImageHandler(imageHandler);
config.setEmitterConfiguration(HTMLRenderOption.OUTPUT_FORMAT_HTML, hc);
ReportEngine engine = new ReportEngine(config);
IReportRunnable report = null;
String reportFilepath = "C:/Workspace/EntireJ/Besuchblatt/reports/new_report.rptdesign";
HTMLRenderOption options = new HTMLRenderOption();
options.setOutputFormat(format);
options.setOutputFileName("C:/Workspace/myProject/birtReport" + reportNr + ".pdf");
long startTime = System.currentTimeMillis();
try {
    report = engine.openReportDesign(reportFilepath);
}
catch (EngineException e) {
    System.err.println("Report " + reportFilepath + " not found!\n");
    engine.destroy( );
    return;
}
IRunAndRenderTask task = engine.createRunAndRenderTask(report);
task.setRenderOption(options);
task.setParameterValues(parametersMap);
try {
    task.run();
    return (System.currentTimeMillis() - startTime);
}
catch ( EngineException e1 ) {
    System.err.println( "Report " + reportFilepath + " run failed.\n");
    System.err.println( e1.toString( ) );
}
engine.destroy( );

在我的案例中,有没有办法优化Birt的表现?

4 个答案:

答案 0 :(得分:8)

在阅读类似的讨论并完成我的评估后,我认为在大多数情况下,Birt实际上比Jasper慢得多。有一些事情要做,以使其更快,但他们目前花费时间,而Jasper已经为基本的报告需求提供了良好的表现。我不知道它是否能比Jasper表现更好,以防我更好地设置或优化代码或报告模板,但在大多数类似的情况下,我在互联网上讨论,人们只是接受这种表现并保持原样。以下是openMRS中关闭未解决问题的问题示例:https://tickets.openmrs.org/browse/BIRT-30

我希望下面的图片不会让我失望,但我真的很想发布它。我还想把它发送给我的老板作为评估的答案,但我宁愿不这样做:

Jasper Birt Evaluation

答案 1 :(得分:3)

如果有人需要它......

Intel i3上的Java应用程序,带有4cores 5Gb。 Oracle数据库服务器。

jasper和birt的类似报告模板,它对数据库和20个子请求(子报告)发出20个请求。

目标: 在30个线程中生成6000个pdf文档(每个线程200个文档)。

QA:

  • 为什么birt 2.6.2?
    • 我们目前正在使用它,我们将其与4.5进行比较 - 对我们没有任何实际好处。
    • birt 4. +调用getParameterMetaData(),但未在oracle ojdbc6中实现,部分调用ojdbc7,只会减慢执行速度
  • 为什么2.6.2打补丁?
    • 在birt 2. +和3. +中存在问题,可能在更高版本中:通过javascript和这些脚本的解析/编译版本评估的所有数据集参数都不会被缓存。 described here。评估的JS列完美地缓存在ReportRunnable中。
  • 为什么Jasper有继续子报告运行器?
    • Continuation Subreport Runner (described here)在主报表主题的主题中运行所有子报表。默认情况下,jasper 6.2使用ThreadPoolSubreportRunnerFactory(我认为是错误的)将所有先前检索到的数据保存在内存中,直到完成GC并且它启动了大量的线程。

results

答案 2 :(得分:1)

该引擎旨在重复使用。您应该创建一次,然后运行10个报告。当第一个报告运行时,引擎会加载很多类 - 后续运行会快得多。此外,引擎缓存字体。 您的测试设置不公平。

答案 3 :(得分:0)

我认为这是因为您在每次运行时都会创建并销毁BIRT报告引擎。您应该只初始化一次报告引擎,并将其保存在类的静态变量中,以便生成下一代报告。这会快得多