Почему следующий API Java NIO такой медленный по сравнению с nettyJAVA

Программисты JAVA общаются здесь
Anonymous
Почему следующий API Java NIO такой медленный по сравнению с netty

Сообщение Anonymous »

У меня есть следующая реализация JAVA для создания простого веб-сервера с использованием NIO API.

Код: Выделить всё

package zion

import java.net._
import java.nio.ByteBuffer
import java.nio.channels._

object NHello {

import java.nio.CharBuffer
import java.nio.charset.Charset

def helloWorldBytes: ByteBuffer = Charset
.forName("ISO-8859-1")
.newEncoder
.encode(CharBuffer.wrap(httpResponse("NHello World\n")))

def httpResponse(content: String): String = {
val rn = "\r\n"
List(
"HTTP/1.1 200 OK",
"Content-Type: text/html",
"Connection: Keep-Alive",
s"Content-Length: ${content.length()}",
rn + content
).mkString(rn)
}

def main(args: Array[String]): Unit = {
val port    = 8080
val address = new InetSocketAddress(port)

// Server Socket Channel
val serverSocketChannel = ServerSocketChannel.open()
serverSocketChannel.bind(address)
serverSocketChannel.configureBlocking(false)

// Selector
val selector = Selector.open()
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT)

while (true) {
selector.select()
val iterator = selector.selectedKeys().iterator()
while (iterator.hasNext) {
val key = iterator.next()
if (key.isAcceptable) {
val channel = serverSocketChannel.accept()
channel.write(helloWorldBytes)
channel.close()
}

}
iterator.remove()
}

sys.addShutdownHook({
println("Shutting down...")
serverSocketChannel.close()
})

println("Exiting...")
}
}
Используя wrk, я получаю около нескольких тысяч запросов в секунду.

Код: Выделить всё

wrk -t12 -c100 -d10s http://127.0.0.1:8080
Это кажется слишком медленным по сравнению с Netty. С Netty я могу повысить пропускную способность как минимум в 10–15 раз. Учитывая, что Netty также построена на базе NIO, что я делаю не так?

Есть ли какие-то очевидные улучшения производительности, которых мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/615 ... d-to-netty

Вернуться в «JAVA»