我的 Scala 服務器通過(從我的套接字客戶端發送的一些位元組,位元組的大小列印在下面)InputStream從套接字獲取物件socket.getInputStream
以下代碼嘗試將其讀取到 Array
var buffer: Array[Byte] = null
def read(stream: InputStream, size: Int) = {
val start = System.nanoTime()
buffer = new Array[Byte](size)
var value: Int = 0
(0 until size).foreach(i => {
value = stream.read()
buffer(i) = value.toByte
})
val end = System.nanoTime()
println(s"Getting buffer from InputStream, size: $size, cost: ${(end - start)/1e6} ms")
buffer
}
部分輸出是
Getting buffer from InputStream, size: 4, cost: 174.923596 ms
Getting buffer from InputStream, size: 2408728, cost: 919.207885 ms
然而,對于相同的資料大小,一些現有的服務器可能會快得多,例如 Redis 可以在 ~10ms 內發送位元組,所以
是否可以提高該程式的性能?
uj5u.com熱心網友回復:
stream.read()是對這個概念最慢的理解。
相反,您需要read(byte[])變體或read(byte[], int offset, int length)變體(一個只是一個非常簡單且性能方面基本上免費的 3-param 方法的包裝器)。
使用的“開銷”read()范圍從“輕微”(如果涉及緩沖區)到“1000 倍”(如果沒有緩沖區)。如果是第二個,您可以通過將輸入流包裝在 a 中BufferedInputStream并從中讀取來回到“輕微”開銷。
但無論發生什么,這:
int toRead = 1000;
byte[] data = new byte[toRead];
int readSoFar = 0;
while (readSoFar < toRead) {
int read = in.read(data, readSoFar, toRead - readSoFar);
if (read == -1) throw new IOException("Expected more data");
toRead = read;
}
遠遠快于:
int toRead = 1000;
byte[] data = new byte[toRead];
while (toRead > 0) {
data[toRead--] = in.read();
}
使用 scala 對這些示例的性能沒有影響。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422308.html
標籤:
上一篇:Scala根據所需元素的數量和已知的第一個元素生成元素集合
下一篇:RegInit僅在重置時初始化值
