首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JasperReports比Birt快10倍吗?

JasperReports比Birt快10倍吗?
EN

Stack Overflow用户
提问于 2013-07-29 08:24:27
回答 4查看 12.9K关注 0票数 3

我正在对JasperReports和Birt报告引擎进行评估。

我在这两个工具中设计了一个简单的报表,我将20个值作为参数,并将报表中SQL选择中的6个其他值作为详细关系填充(这意味着我有许多行)。

我用Java和PDF导出编写了两个报告的创建程序(我认为这两个报告引擎都使用iText)

我测量了每一份报告所需的时间。这些报告是完全相同的,它们是从同一个过程中运行的。

该报告运行了10组值。所以我测量了10份报告中每一份的时间。结果是:

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

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

数字是在密室里。

有没有可能贾斯珀比伯特快十倍。我的代码是不是做错了什么,让Birt的事情慢下来了?我正在张贴我在每一种情况下使用的代码:

JasperReports:

代码语言:javascript
复制
// 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:

代码语言:javascript
复制
// 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性能的方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-01 09:29:02

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

我希望下面的图片不会让我失望,但我真的很想贴出来。我还想把它寄给我的老板,作为评估的答案,但我不想:

票数 9
EN

Stack Overflow用户

发布于 2016-02-18 14:38:51

如果有人需要..。

4GB英特尔i3上的Java应用程序。Oracle数据库服务器。

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

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

QA:

  • 为什么birt 2.6.2?
    • 我们目前正在使用它,我们将其与4.5比较-对我们来说没有真正的好处。
    • birt 4.+调用未在oracle ojdbc6中实现的getParameterMetaData(),部分在ojdbc7中实现,只是减慢了执行速度。

  • 为什么打2.6.2补丁?
    • 在birt、2.+和3.+中存在一个问题,可能在以后的版本中也有问题:所有通过javascript和解析/编译的脚本版本计算的数据集参数都没有缓存。在此描述。计算值的JS列在ReportRunnable中被完美地缓存。

  • 为什么Jasper有延续子报告运行程序?
    • 延续子报表运行器(在此介绍)在主报表线程中运行所有子报表。默认情况下,Jasper6.2使用ThreadPoolSubreportRunnerFactory (我认为是错误的)将以前检索的所有数据保存在内存中,直到完整的GC执行为止,并启动大量线程。

票数 3
EN

Stack Overflow用户

发布于 2013-07-29 08:54:31

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17919213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档