JasperReports比Birt快10倍吗?

4

我正在评估JasperReportsBirt报告引擎。

我在两个工具中设计了一个简单的报告,其中我给报告提供了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完成!!!

数字以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);
}

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

有没有办法在我的情况下优化Birt的性能?
4个回答

9
阅读类似的讨论并完成我的评估后,我认为在大多数情况下Birt实际上比Jasper慢得多。有一些事情可以做以使其更快,但它们目前需要时间,而Jasper已经为基本报告需求提供了良好的性能。我不知道如果我设置或优化代码或报告模板是否可以比Jasper表现更好,但在大多数类似的案例中,我在互联网讨论中读到人们只接受这种性能并将其保留。以下是openMRS中未解决的问题示例:https://tickets.openmrs.org/browse/BIRT-30 我希望下面的图片不会让我被downvote,但我真的很想发布它。我也考虑将其作为对评估的回答发送给我的老板,但我宁愿不这样做:Jasper Birt Evaluation

1
我必须在你回答的第一部分表示同意,但是仅仅通过这样一个微不足道的查询来确定搜索结果数量是很幼稚的。只需浏览您搜索的前几个结果,您就会明白我的意思... - Tom Seidel
2
我从未使用过Jasper,但我认为BIRT引擎在执行任务时并不慢(我正在使用最新的4.4.2版本)。也许Jasper更快,可能是这样。你也可以争论内存消耗,是的,它需要大量的内存。无论如何,更合适的做法似乎是发布一些严肃的基准测试链接,而不是像这样愚蠢地进行谷歌搜索... - Aritz
1
SSRS:5,700,000个结果 - SSRS很烂:245,000个结果 - Stefan Steiger

4

如果有人需要...

Intel i3处理器、4核5GB内存的Java应用程序。 使用Oracle数据库服务器。

Jasper和Birt的类似报告模板,需要向数据库发出20个请求和20个子请求(子报告)。

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

常见问题:

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

results


感谢您的帖子。不过,您应该添加结论。Jasper更快,堆内存使用更好。 - Slim Aloui

1
引擎设计为可重用。您应该创建它一次,然后运行10个报告。当第一个报告运行时,引擎会加载许多类 - 后续运行将更快。此外,引擎缓存字体。 您的测试设置不公平。

请阅读Dominique答案下的评论。时间测量不包括引擎的创建和销毁。这甚至不是第一次运行的时间间隔。 - Stefanos Kargas
但是对于每次运行,您都会创建一个新的引擎。从这个引擎的角度来看,它始终是第一个报告。然后它会为每次运行执行大量的初始化工作。请记住,BIRT使用延迟加载策略,对于Java类以及像TTF字体这样的资源也是如此。 - hvb
请忽略我写的代码。我不能发布我测试过的整个代码,因为我不想每次都创建一个新引擎。我真的理解你的意思,但这肯定不是这种情况。 - Stefanos Kargas

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

报告引擎对象创建后,我开始计时。我拥有的时间间隔仅用于创建和运行任务。 - Stefanos Kargas
1
是的,虽然我注意到第一次通过BIRT引擎实例运行报告要生成更长的时间。当我们使用相同的实例时,下一次运行速度会更快,即使具有不同的报告参数值。我无法告诉你原因,可能是引擎缓存解析的rptdesign文件或类似的内容。您可以试试看。 - Dominique
实际上,我发布的时间间隔是在第一次运行之后。对于第一次运行,我得到了4000毫秒的结果。我还尝试过只创建一次对象并将它们重复使用于每个报告中。仍然需要1秒钟才能生成一个报告。 - Stefanos Kargas
我对Jasper不是很了解,但它与Ehcache一起提供,并且可能会缓存最近的输出。我相信当从缓存中检索报告时,我们可以获得大约100毫秒的生成时间。为了进行比较并包括第一次运行,需要在每次运行之间更改一些参数值。 - Dominique
我当然每次都在尝试不同的参数。绝对没有缓存。 - Stefanos Kargas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接