在磁盘上写入文件的进程请求数/秒数较少

时间:2015-06-15 20:27:07

标签: java performance scala

我有一个接收大量请求的进程,并且我使用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()
}

1 个答案:

答案 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可能有所帮助 - 您应该自己测试一下。