LoginSignup
4
0

More than 5 years have passed since last update.

ApacheBenchで雑にNimとGolangを比べてみる

Last updated at Posted at 2017-10-07

Nim という言語が Golang や Rust よりも軽いし早いぜ!!みたいな記事を見かけたので
楽しそうな Nim に乗り換えたいなぁ、でも仕事じゃfizzbuzzでもFibonacciも出てこないからなぁ
と思い ab を使って調べてみました。

やり方がまずいわボケ!みたいなツッコミ待ちで記事を書いたので、ガシガシ突っ込んでもらえると幸いです。

使用するリポジトリ

追記

  • コメントで指摘いただいたので、リリースビルドでベンチマーク取り直しました!
  • 2017/10/31 結果のスコアが平均とずれていたので、より近いものにしました

環境

  • AMI: ami-785c491f

    • Ubuntu
    • VERSION="16.04.2 LTS (Xenial Xerus)"
    • Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
    • cpu cores : 1
  • Instance-Type: t2.micro

    • MemTotal: 1014660 kB

結果

metrics/lang Nim Golang
Requests per second [#/sec] 6527.52 7341.14
Time per request [ms] 15.320 13.622
Time per request [ms] (mean, across all concurrent requests) 0.153 0.136
Transfer rate [Kbytes/sec] received 325.10 931.98

Transfer rate が大体3倍ぐらい差がある...

作業ログ

docker の setup

docker-machine create --driver amazonec2 --amazonec2-region ap-northeast-1 aws-default
eval "$(docker-machine env aws-default | tee ~/.dockerc)"
docker-machine ls aws-default
NAME          ACTIVE   DRIVER      STATE     URL                         SWARM   DOCKER        ERRORS
aws-default   *        amazonec2   Running   tcp://13.114.246.147:2376           v17.09.0-ce   

docker stats だと味気なかったので google/cadvisor を使って監視します

docker-compose build
docker-compose up -d cadvisor

cadvisor のポート開けておきます

aws ec2 describe-instances # security group id 調べる
aws ec2 authorize-security-group-ingress --group-id ${sgid} --port 8080 --cidr $(curl -sSL ifconfig.io)/32 --protocol tcp

まずは nim から...

docker-compose up -d nimapp
# 立ち上がったら、http://${dockerのIP}:8080/containers/docker の一番下をみる
docker-compose up nimapp-bench

なるほど. なるほど. (黄色が nimapp)
スクリーンショット 2017-10-07 22.37.06.png

docker-compose logs nimapp-bench
...
nimapp-bench_1  | Concurrency Level:      100
nimapp-bench_1  | Time taken for tests:   15.501 seconds
nimapp-bench_1  | Complete requests:      100000
nimapp-bench_1  | Failed requests:        0
nimapp-bench_1  | Total transferred:      5100000 bytes
nimapp-bench_1  | HTML transferred:       1200000 bytes
nimapp-bench_1  | Requests per second:    6451.14 [#/sec] (mean)
nimapp-bench_1  | Time per request:       15.501 [ms] (mean)
nimapp-bench_1  | Time per request:       0.155 [ms] (mean, across all concurrent requests)
nimapp-bench_1  | Transfer rate:          321.30 [Kbytes/sec] received
...

次に Golang を...

docker-compose stop nimapp
docker-compose up -d goapp
docker-compose up goapp-bench

なるほど. なるほど. なるほど. (青がgoapp)

スクリーンショット 2017-10-07 11.22.36.png

docker-compose logs goapp-bench
...
goapp-bench_1   | Concurrency Level:      100
goapp-bench_1   | Time taken for tests:   14.371 seconds
goapp-bench_1   | Complete requests:      100000
goapp-bench_1   | Failed requests:        0
goapp-bench_1   | Total transferred:      13000000 bytes
goapp-bench_1   | HTML transferred:       1300000 bytes
goapp-bench_1   | Requests per second:    6958.52 [#/sec] (mean)
goapp-bench_1   | Time per request:       14.371 [ms] (mean)
goapp-bench_1   | Time per request:       0.144 [ms] (mean, across all concurrent requests)
goapp-bench_1   | Transfer rate:          883.41 [Kbytes/sec] received
...

... よくわからないので、並べて検証します

docker-compose stop goapp nimapp
docker system prune # 一旦掃除

docker-compose up -d goapp nimapp
docker-compose up goapp-bench
docker-compose up nimapp-bench

... なるほど? (赤 goapp, 黄 nimapp)

スクリーンショット 2017-10-07 22.48.48.png

感想

  • Nim は素人には難しそうです。。
  • クロスコンパイルもちょっと手元のPCだけだと難しそう。。。
  • 参考にしたページだと Golang と同じ rps でたとのことだったので、検証手順が間違っている可能性は大きいです 間違ってました
  • 同時接続数が 100 なのは 1000 ぐらい越えると nim 側が詰まりはじめるので
    少なめに設定しています。
    普通に nim でも捌けました。しゅごい

    • 逆に golang とか netty とかが捌けるのはなんでなんだ
  • 自分でベンチマークとるの重要 ちゃんとドキュメント読むの重要

参考

4
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0