Оберните ваш FileInputStream внутри BufferedInputStream. Таким образом, вы избегаете проходить через стек хранения вашей операционной системы для каждого отдельного байта, а вместо этого читаете их несколько за один проход в память.
Или для цели измерения производительности синтаксического анализа отдельно от чтения байт из файла, попробуйте загрузить его заранее в память:
public static void main( String[] args ) throws Exception {
File file = new File("C:\\Users\\Public\\Documents\\bigemail.eml");
byte[] data = new byte[Math.toIntExact(file.length())];
FileInputStream fis = new FileInputStream(file);
int bytesRead = fis.read(data);
System.out.println("Read " + bytesRead + " bytes");
fis.close();
for(int i=0; i<5; i++) {
parseMail(new ByteArrayInputStream(data));
}
}
private static void parseMail(InputStream memoryStream) throws Exception {
var start = System.nanoTime();
MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties()),memoryStream);
var stop = System.nanoTime();
System.out.printf("Parsing? took %f s\n", (stop-start)/1_000_000_000.0);
System.out.println("Subject: " + message.getSubject());
}
На моем ноутбуке вывод показывает:
Считать 12610414 байт
Парсинг? Взял 0,261948 с
Тема: FW: .........
Парсинг? Взял 0,024068 с
Тема: FW: .........
Разбор? Взял 0,020336 с
Тема: FW: .........
Разбор? Взял 0,010707 с
Тема: FW: .........
Парсинг? Прошло 0,010973 с
Тема: FW: .........
Так что первый раз кажется немного медленнее, но для 12 МБ все еще далеко от того, что вы сообщают.
Это использует Oracle Java 10 в системе с 16 ГБ памяти и использует эту зависимость maven:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>