我有一個進程接收很多請求,並且我正在運行一些使用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()
}
除了其他任何東西,你爲什麼要將字節數組轉換爲字符串?爲什麼不直接將二進制數據寫入磁盤? (這將採取*你的一些CPU *很可能相當數量。) –
我這樣做是因爲我需要編寫被評論的代碼。 X發件人必須在第一行。你知道如何在X-Sender內容(如fw.write(「blabla」); fw.write(binary)?)之後編寫二進制數據? – placplacboom
好吧,無論如何,我會'OutputStreamWriter'寫出文本,刷新寫入,然後將二進制數據直接寫入基礎流。 –