【问题标题】:Is JasperReports 10 times faster than Birt?JasperReports 比 Birt 快 10 倍?
【发布时间】:2013-07-29 08:24:27
【问题描述】:

我正在评估 JasperReportsBirt 报告引擎。

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

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

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

数字以毫秒为单位。

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 的性能?

【问题讨论】:

    标签: java performance jasper-reports birt


    【解决方案1】:

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

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

    【讨论】:

    • 我必须同意您答案的第一部分,但是获取这样一个无关紧要的查询的搜索结果数量是天真的。只需浏览搜索的第一个结果,您就会明白我的意思...
    • 我从未使用过 Jasper,但我不认为 BIRT 引擎在工作时会很慢(我使用的是最新的 4.4.2 版本)。可能 Jasper 更快,可能是。你也可以争论内存消耗,是的,它需要大量的内存。无论如何,发布一个好的链接到一些严肃的基准测试而不是这样愚蠢的谷歌搜索似乎更合适......
    • SSRS:5,700,000 个结果 - SSRS 很烂:245,000 个结果
    【解决方案2】:

    如果有人需要...

    4 核 5Gb 英特尔 i3 上的 Java 应用程序。 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 评估的数据集参数和这些脚本的解析/编译版本都不会被缓存。 described here。评估的 JS 列完美地缓存在 ReportRunnable 中。
    • 为什么 Jasper 使用延续子报表运行器?
      • Continuation Subreport Runner (described here) 在主报表线程的线程中运行所有子报表。默认情况下,jasper 6.2 使用 ThreadPoolSubreportRunnerFactory (我认为是错误的)将所有以前检索到的数据保存在内存中,直到执行完全 GC 并启动大量线程。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我在创建报表引擎对象后开始测量时间。我的时间间隔仅用于创建和运行任务。
      • 是的,虽然我注意到第一次通过 BIRT 引擎实例运行报告时生成的报告要长得多。当我们使用相同的实例时,即使使用不同的报告参数值,下一次运行也会更快。我无法告诉你为什么,可能是引擎正在缓存解析的 rptdesign 文件或类似的东西。你可以试一试
      • 实际上我发布的时间间隔是在第一次运行之后。第一次运行我得到 4000 毫秒。我还尝试只创建一次对象并为每个报告重复使用它们。仍然是同一时间,每个报告 1 秒。
      • 我不太了解 Jasper,但它随 Ehcache 一起提供,并且可能正在缓存最近的输出。我相信 100 毫秒是我们从缓存中检索报告时获得的那种生成时间。需要在每次运行之间更改一些参数值以进行比较,并包括第一次运行。
      • 当然,我每次都在尝试不同的参数。绝对没有缓存。
      【解决方案4】:

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

      【讨论】:

      • 请阅读 Dominique 回答下的 cmets。时间测量不包含引擎的创建和销毁。这些甚至不是第一次运行的时间间隔。
      • 但每次运行都会创建一个新引擎。因此,从这个引擎的角度来看,它始终是第一个报告。然后它会做很多初始化工作——每次运行。请记住,BIRT 使用延迟加载策略,用于 Java 类以及用于 TTF 字体等资源的 AS。
      • 请忽略我写的代码。我不能发布我测试的整个代码,我不会每次都创建一个新引擎。我真的明白你的意思,但事实并非如此。
      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 2022-01-22
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2014-07-13
      相关资源
      最近更新 更多