В недавнем выступлении на Swift London Криса Бейли из команды IBM-Swift был показан интересный график тестов для серверного Swift.

Я был очень удивлен этими результатами, поэтому я провел несколько локальных тестов против последней версии Vapor (0,15), последней версии, ориентированной на производительность (0,11), и Vapor’s Engine (0,4 используется в Vapor 0,15) против Kitura (0,24).

Результаты показывают, что последний релиз Vapor превосходит Kitura, а последний релиз отстает примерно на 5%. Не совсем то 40% -ное преимущество, которое видно на графике IBM-Swift. Более того, Vapor’s Engine, который, возможно, более сопоставим с Kitura, имеет значительное преимущество.

Возможно, тесты IBM находят слабое место в Vapor, но нам трудно узнать об этом, поскольку точная среда и тест не были включены в результаты IBM. Если у кого-то есть подробности о среде и процессе, прокомментируйте, чтобы мы могли улучшить нашу настройку!

Полученные результаты

Как всегда, в этой статье представлены подробные сведения и результаты тестов.

Машина

Пар (0,11)

Gertrude:~ tanner$ wrk -d 10 -t 4 -c 8 http://localhost:8080/plaintext
Running 10s test @ http://localhost:8080/plaintext
4 threads and 8 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 438.06us 97.97us 5.03ms 84.30%
Req/Sec 4.53k 140.02 5.04k 70.79%
182307 requests in 10.10s, 25.91MB read
Requests/sec: 18050.53
Transfer/sec: 2.56MB

Пар (0,15)

Gertrude:~ tanner$ wrk -d 10 -t 4 -c 8 http://localhost:8080/plaintext
Running 10s test @ http://localhost:8080/plaintext
4 threads and 8 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 475.26us 82.59us 3.63ms 88.41%
Req/Sec 4.19k 153.49 4.44k 83.91%
168460 requests in 10.10s, 15.90MB read
Requests/sec: 16679.73
Transfer/sec: 1.57MB

Паровой двигатель (0,4)

Gertrude:~ tanner$ wrk -d 10 -t 4 -c 8 http://localhost:8080/plaintext
Running 10s test @ http://localhost:8080/plaintext
4 threads and 8 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 403.89us 103.08us 5.38ms 93.14%
Req/Sec 4.94k 246.49 5.19k 90.10%
198474 requests in 10.10s, 9.46MB read
Requests/sec: 19651.14
Transfer/sec: 0.94MB

Китура (0,24)

Gertrude:~ tanner$ wrk -d 10 -t 4 -c 8 http://localhost:8090/plaintext
Running 10s test @ http://localhost:8090/plaintext
4 threads and 8 connections
Thread Stats   Avg      Stdev     Max   +/- Stdev
Latency   459.65us  205.53us   9.85ms   95.29%
Req/Sec     4.32k   675.34     5.33k    61.04%
173126 requests in 10.10s, 23.57MB read
Requests/sec:  17141.44
Transfer/sec:      2.33MB

Код

И, конечно же, исходный код.

Пар (0,11)

import Vapor
let app = Application()
app.get("plaintext") { request in
    return “Hello, world”
}
app.globalMiddleware = []
app.start()

Пар (0,15)

import Vapor
let drop = Droplet()
drop.get("plaintext") { request in
    return "Hello, world"
}
drop.globalMiddleware = []
drop.serve()

Паровой двигатель (0,4)

import HTTP
final class Responder: HTTP.Responder {
    func respond(to request: Request) throws -> Response {
        let body = “Hello World”.makeBody()
        return Response(body: body)
    }
}
let server = try Server<
    TCPServerStream, 
    Parser<Request>, 
    Serializer<Response>
>(port: port)
try server.start(responder: Responder()) { error in
    print(“Got error: \(error)”)
}

Китура (0,24)

import Kitura
let router = Router()
router.get("/plaintext") { request, response, next in
    response.send("Hello, World!")
    next()
}
Kitura.addHTTPServer(onPort: 8090, with: router)
Kitura.run()