3

I am doing an evaluation of JasperReports and Birt reporting engines.

I designed a simple report in both tools where I give 20 values to the report as parameters and fill 6 other values from an SQL selection in the report as detail relation (this means that I have many rows of them).
I programmed the creation of both reports in Java and the PDF export (I think both reporting engines use iText)
I measured the time each report needed. The reports are exactly the same and they are ran from the same process.
The report was ran for 10 sets of values. So I measured the time for each of the 10 reports. The result was:

Printing Jasper reports for 10 values. Measuring time needed. 110 109 141 125 110 125 110 125 109 110 Jasper Finished!!!

Printing Birt reports for 10 values. Measuring time needed. 1063 1017 1095 1079 1063 1079 1048 1064 1079 1080 Birt Finished!!!

The numbers are in msecs.

Is it possible that Jasper is 10 times faster than Birt. Am I doing something wrong with my code that slows things down for Birt? I am posting the code I used in each case:

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);
}

Birt:

// 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( );

Is there a way to optimize Birt's performance in my case?

4

4 回答 4

9

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

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

贾斯珀伯特评价

于 2013-10-01T09:29:02.010 回答
3

如果有人需要...

英特尔 i3 上的 Java 应用程序,具有 4 核 5Gb。Oracle 数据库服务器。

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

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

质量保证:

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

结果

于 2016-02-18T14:38:51.103 回答
1

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

于 2014-09-24T15:28:43.070 回答
1

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

于 2013-07-29T08:54:31.407 回答