Skip to content

Instantly share code, notes, and snippets.

@nmilford
Last active September 5, 2018 13:53
Show Gist options
  • Save nmilford/6238033 to your computer and use it in GitHub Desktop.
Save nmilford/6238033 to your computer and use it in GitHub Desktop.
A quick, non-conclusive, non-scientific tete-a-tete HelloWorld off for poops-n-giggles.

Inspired by https://gist.github.com/josevalim/1582864

Environment

Ubuntu 12.04

Linux citadel 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

  • 12G of DDR3 RAM (@ 1033MHz)
  • 16 cores (E5530 @ 2.40GHz)

Go

  • go 1.1.2
$ ab -n 10000 -c 40 http://127.0.0.1:3333/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        
Server Hostname:        127.0.0.1
Server Port:            3333

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      40
Time taken for tests:   1.470 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1090000 bytes
HTML transferred:       120000 bytes
Requests per second:    6803.56 [#/sec] (mean)
Time per request:       5.879 [ms] (mean)
Time per request:       0.147 [ms] (mean, across all concurrent requests)
Transfer rate:          724.21 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     1    6   0.8      6      12
Waiting:        1    6   0.8      6      12
Total:          2    6   0.8      6      12

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      6
  75%      6
  80%      6
  90%      7
  95%      7
  98%      7
  99%      8
 100%     12 (longest request)

Ruby / Sinatra Synchrony

  • ruby 1.9.3p194
  • sinatra-synchrony 0.4.1
$ ab -n 10000 -c 40 http://127.0.0.1:3050/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        thin
Server Hostname:        127.0.0.1
Server Port:            3050

Document Path:          /
Document Length:        18 bytes

Concurrency Level:      40
Time taken for tests:   4.521 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10000
Total transferred:      2780000 bytes
HTML transferred:       180000 bytes
Requests per second:    2212.11 [#/sec] (mean)
Time per request:       18.082 [ms] (mean)
Time per request:       0.452 [ms] (mean, across all concurrent requests)
Transfer rate:          600.55 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:    14   18   3.0     16      48
Waiting:       11   14   2.9     12      44
Total:         14   18   3.1     16      48

Percentage of the requests served within a certain time (ms)
  50%     16
  66%     21
  75%     21
  80%     21
  90%     22
  95%     22
  98%     22
  99%     22
 100%     48 (longest request)

JRuby / Sinatra + Trinidad

  • Oracle JDK 1.7.0_25
  • JRuby 1.7.4 (1.9.3p392)
  • Trinidad 1.4.5 (tomcat 7 container)

This is much simpler than above, looks like:

require 'sinatra'

get '/' do
  "Hello World"
end
$ ab -n 10000 -c 40 http://127.0.0.1:4567/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache-Coyote/1.1
Server Hostname:        127.0.0.1
Server Port:            4567

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      40
Time taken for tests:   1.473 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2670000 bytes
HTML transferred:       110000 bytes
Requests per second:    6789.92 [#/sec] (mean)
Time per request:       5.891 [ms] (mean)
Time per request:       0.147 [ms] (mean, across all concurrent requests)
Transfer rate:          1770.42 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       4
Processing:     1    6   4.2      4      26
Waiting:        1    6   4.2      4      26
Total:          1    6   4.2      4      26

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      6
  75%      8
  80%      9
  90%     12
  95%     15
  98%     18
  99%     20
 100%     26 (longest request)

NodeJS / Express

  • node 0.10.15
  • express 3.3.5
$ ab -n 10000 -c 40 http://127.0.0.1:3000/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        
Server Hostname:        127.0.0.1
Server Port:            3000

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      40
Time taken for tests:   2.329 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1690000 bytes
HTML transferred:       110000 bytes
Requests per second:    4292.96 [#/sec] (mean)
Time per request:       9.318 [ms] (mean)
Time per request:       0.233 [ms] (mean, across all concurrent requests)
Transfer rate:          708.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     4    9   1.6      9      24
Waiting:        3    9   1.6      9      24
Total:          5    9   1.6      9      24

Percentage of the requests served within a certain time (ms)
  50%      9
  66%      9
  75%      9
  80%     10
  90%     11
  95%     12
  98%     14
  99%     17
 100%     24 (longest request)

Elixir / Dynamo

  • Erlang R16B01
  • Elixir 0.10.2-dev
  • Dynamo HEAD
$ ab -n 10000 -c 40 http://127.0.0.1:3030/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        
Server Hostname:        127.0.0.1
Server Port:            3030

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      40
Time taken for tests:   0.439 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1560000 bytes
HTML transferred:       120000 bytes
Requests per second:    22798.21 [#/sec] (mean)
Time per request:       1.755 [ms] (mean)
Time per request:       0.044 [ms] (mean, across all concurrent requests)
Transfer rate:          3473.16 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.1      1       2
Processing:     0    1   0.2      1       4
Waiting:        0    1   0.2      1       4
Total:          1    2   0.3      2       5

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      2
  95%      2
  98%      3
  99%      3
 100%      5 (longest request)

Scala / Scalatra

  • Oracle JDK 1.7.0_25
  • Scala 2.10.2
  • Scalatra 2.2.1

NB: I imagine there are faster Scala frameworks, or I did something wrong...

$ ab -n 10000 -c 40 http://127.0.0.1:8080/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Jetty(8.1.8.v20121106)
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      40
Time taken for tests:   16.145 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1220000 bytes
HTML transferred:       110000 bytes
Requests per second:    619.37 [#/sec] (mean)
Time per request:       64.581 [ms] (mean)
Time per request:       1.615 [ms] (mean, across all concurrent requests)
Transfer rate:          73.79 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     2   64  40.7     55     260
Waiting:        1   63  40.4     53     250
Total:          2   64  40.7     55     260

Percentage of the requests served within a certain time (ms)
  50%     55
  66%     74
  75%     88
  80%     97
  90%    124
  95%    146
  98%    168
  99%    179
 100%    260 (longest request)

Python / Flask

  • Python 2.7.3
  • Flask 0.10.1
$ ab -n 10000 -c 40 http://127.0.0.1:5000/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Werkzeug/0.9.3
Server Hostname:        127.0.0.1
Server Port:            5000

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      40
Time taken for tests:   6.078 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1640000 bytes
HTML transferred:       110000 bytes
Requests per second:    1645.37 [#/sec] (mean)
Time per request:       24.311 [ms] (mean)
Time per request:       0.608 [ms] (mean, across all concurrent requests)
Transfer rate:          263.52 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     2   24   0.9     24      32
Waiting:        1   24   0.9     24      32
Total:          3   24   0.9     24      32

Percentage of the requests served within a certain time (ms)
  50%     24
  66%     24
  75%     24
  80%     24
  90%     24
  95%     25
  98%     25
  99%     25
 100%     32 (longest request)
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintln(w, "Hello World")
})
log.Fatal(http.ListenAndServe(":3333", nil))
}
require 'sinatra/base'
require 'sinatra/synchrony'
class HelloWorld < Sinatra::Base
register Sinatra::Synchrony
get '/' do
'Hello World'
end
end
var express = require('express'),
app = express.createServer();
app.get('/', function(req, res){
res.send('Hello World');
});
app.listen(3000);
defmodule HelloWorld do
use Dynamo
use Dynamo.Router
config :dynamo, compile_on_demand: false
config :server, port: 3030
get "/" do
conn.resp_body("Hello World")
end
end
HelloWorld.start_link
HelloWorld.run
package com.example.app
import org.scalatra._
import scalate.ScalateSupport
class MyScalatraServlet extends MyScalatraWebAppStack {
get("/") {
"Hello world"
}
}
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World"
if __name__ == "__main__":
app.run()
@josevalim
Copy link

Nice work! Just as a note, Elixir is using all cores out of the box. Maybe others are using all cores too (JRuby?), but some (like Go) require an explicit option. So you may want to pass the command you used to start each just for clarification. And others probably can't work efficiently on all cores anyway.

@youroff
Copy link

youroff commented Aug 15, 2013

Disappointing results for Scala. I guess there should be some params for JVM to run it well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment