我正在评估 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的表现?
答案 0 :(得分:8)
在阅读类似的讨论并完成我的评估后,我认为在大多数情况下,Birt实际上比Jasper慢得多。有一些事情要做,以使其更快,但他们目前花费时间,而Jasper已经为基本的报告需求提供了良好的表现。我不知道它是否能比Jasper表现更好,以防我更好地设置或优化代码或报告模板,但在大多数类似的情况下,我在互联网上讨论,人们只是接受这种表现并保持原样。以下是openMRS中关闭未解决问题的问题示例:https://tickets.openmrs.org/browse/BIRT-30
我希望下面的图片不会让我失望,但我真的很想发布它。我还想把它发送给我的老板作为评估的答案,但我宁愿不这样做:
答案 1 :(得分:3)
如果有人需要它......
Intel i3上的Java应用程序,带有4cores 5Gb。 Oracle数据库服务器。
jasper和birt的类似报告模板,它对数据库和20个子请求(子报告)发出20个请求。
目标: 在30个线程中生成6000个pdf文档(每个线程200个文档)。
QA:
答案 2 :(得分:1)
该引擎旨在重复使用。您应该创建一次,然后运行10个报告。当第一个报告运行时,引擎会加载很多类 - 后续运行会快得多。此外,引擎缓存字体。 您的测试设置不公平。
答案 3 :(得分:0)
我认为这是因为您在每次运行时都会创建并销毁BIRT报告引擎。您应该只初始化一次报告引擎,并将其保存在类的静态变量中,以便生成下一代报告。这会快得多