我有一个接收大量请求的进程,并且我使用Apache Bench运行一些负载测试,以找出它为何如此慢(240个请求/秒)。
我已经分离了所有点,我发现了哪个部分很慢:
def writeEmailToFile(mailMessage:MimeMessage, outputPath:String) ={
val baos = new ByteArrayOutputStream();
mailMessage.writeTo(baos, Array[String]("X-Sender"))
baos.close()
/*
//after i'll need to include it as first line
val emailContent = new StringBuilder()
emailContent.append("X-Sender: ")
emailContent.append(mailMessage.getHeader("X-Sender")(0))
emailContent.append(System.getProperty("line.separator"))
emailContent.append(new String(baos.toByteArray, "UTF-8"))
*/
val fw = new FileWriter(outputPath)
fw.write(new String(baos.toByteArray, "UTF-8"))
fw.flush()
fw.close()
}
这是我做了一些优化但仍然很慢的代码 - 在优化之前它是98个请求/秒,现在我有240个请求/秒。
任何人都可以帮我改进这种方法吗?我正在创建一个ByteArrayOutoutStream并再次添加X-Send,因为这必须是第一行存档。
提前感谢。
写入字节:322个请求/秒。
def writeEmailToFile(mailMessage:MimeMessage, outputPath:String) ={
val baos = new ByteArrayOutputStream()
val outputStream = new FileOutputStream(outputPath)
mailMessage.writeTo(baos, Array[String]("X-Sender"))
baos.writeTo(outputStream)
outputStream.flush()
outputStream.close()
baos.flush()
baos.close()
}
答案 0 :(得分:2)
我不清楚done
实际上做了什么,但感觉你的初始代码在将所有内容转换为字符串并返回时非常浪费,甚至你的第二个代码也做了很多内存中的东西可以直接进入磁盘:
mailMessage.writeTo(baos, Array[String]("X-Sender"))
基本上,您删除的干预步骤越多,所需的工作就越少。如果// TODO: Try wrapping this in a BufferedOutputStream
try (FileOutputStream output = new FileOutputStream(outputPath)) {
mailMessage.writeTo(output, Array[String]("X-Sender"));
}
写入了以很多小块的形式提供的流,使用mailMessage.writeTo
可能有所帮助 - 您应该自己测试一下。