java - 在 Eclipse 中使用 Package 选项导出 Runnable Jar 时,Apache POI 非常慢
问题描述
当我使用 Eclipse 中的 Package 选项导出可运行 jar 时读取 excel 文件时,Apache POI 出现性能问题,而不是使用将所需库提取到生成的 JAR 选项。
为了向您展示问题,我创建了一个最小程序。build.gradle 文件是:
plugins {
id 'java'
}
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2'
}
和 App.java 文件:
import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class App {
public static void main(final String[] args) {
final String excelPath = System.getProperty("user.dir") + "/libro.xlsx" ;
try {
final FileInputStream fis = new FileInputStream(new File(excelPath));
final long TIMER = System.currentTimeMillis();
System.out.println( "start") ;
XSSFWorkbook wb = new XSSFWorkbook( fis );
wb.close();
System.out.println( "end : " + ( System.currentTimeMillis() - TIMER) + " msec" ) ;
} catch (final Exception e) {
System.out.println("error " + e.getMessage()) ;
}
}
}
当我使用空的 excel 文件运行程序时,我在同一台机器上使用相同的文件得到以下结果:
使用提取选项生成:
C:\temp>java -jar prueba.jar start end : 603 msec
使用 Package 选项生成:
C:\temp>java -jar prueba.jar start end : 6015 msec
大约10倍以上。
这可能是什么问题,我该如何解决它以使执行时间相似?
谁能帮我找到问题并解决它?
先感谢您。
解决方案
jar tf
您可以使用后跟存档查看两个文件之间的差异。可能其中一个档案包含签名的内容,这意味着在加载时,JVM 将验证内容是否相同。您可能会看到使用 运行时是否有类似的执行时间-Xverify:none
,尽管我建议不要在生产系统中这样做。
推荐阅读
- javascript - 如何检查道具中的元素是否匹配条件?
- python - 使用scrapy下载内容并保存到列表中
- latex - Doxygen LaTeX 输出段落缩进
- symfony - 我在部署到生产后清除了缓存,但也丢失了我的应用程序缓存。如何在看到新的 symfony 代码更新时排除我的池?
- php - 可以使用 PHP 睡眠功能来减轻 bot 流量吗?
- java - Hibernate & Spring - org.hibernate.PropertyAccessException:无法通过反射设置字段值 [1] 值
- javascript - 从字符串中分离整数和小数
- node.js - 查找属于(父)类别的英语单词含义的算法
- python - Pyspark - groupby([col list]).agg(count([col list))
- c++ - 基本算法运行时间Big O()计算题