Skip to content

Instantly share code, notes, and snippets.

@jiro4989
Created April 4, 2020 02:56
Show Gist options
  • Select an option

  • Save jiro4989/aa8a9cdbd50b9a5030c351e4eca883fd to your computer and use it in GitHub Desktop.

Select an option

Save jiro4989/aa8a9cdbd50b9a5030c351e4eca883fd to your computer and use it in GitHub Desktop.
Nim 1.2.0のベンチマーク

Nim 1.2.0 と他の言語の文字列結合ベンチマーク

  • Nim 1.2.0 がリリースされた
  • 高速化されたらしいので何かベンチマークしてみたい
  • ついでに他の言語でもやってみる

計測方法

「100万回文字列結合して結果をファイル出力する」処理を100回計測して、その結果の平均値をだす。

実行方法

このGistのスクリプトを全部同じディレクトリに配置。 以下のコマンドを実行する。

./run.sh

実行結果

Nim 1.2.0が一番早い。文字列結合以外でも計測してみたいな。

go             average:  0.19206
nim_1.0.2      average:  0.07297
nim_1.2.0      average:  0.07045
nim_1.2.0_arc  average:  0.07046
python         average:  0.20391

補足

  1. 最初に計測しようとして書いた main.go だと1分くらいかかって計測にならなかったので より速度の出る別の書き方に変えている。

  2. RubyとBashは計測用のスクリプトだけ書いたけれど、時間かかりすぎて計測にならなかったので計測していない

#!/bin/bash
set -eu
for l in go nim_1.0.2 nim_1.2.0 nim_1.2.0_arc python; do
cat result/$l/*.txt | grep real | sed 's/0m//g;s/s//g' | awk -v l=$l '{ sum += $2 } END{ print l, "average:", sum / NR }'
done | column -t
package main
import (
"fmt"
"strconv"
)
func main() {
fmt.Println("1.13.8")
var s string
for i := 0; i < 1000000; i++ {
s += strconv.Itoa(i)
}
fmt.Println("end")
}
echo NimVersion
var s: string
for i in 1..1000000:
s.add($i)
writeFile("out.txt", s)
echo "end"
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
def main():
print("3.7.5")
s = ""
for i in range(0, 1000000):
s += str(i)
with open("out.txt", "w") as w:
w.write(s)
print("end")
if __name__ == '__main__':
main()
#!/usr/bin/env ruby
puts "2.5.5"
s = ""
1000000.times do |i|
s += i.to_s
end
puts "end"
#!/bin/bash
set -eu
echo "5.0.3"
s=""
for ((i = 0; i < 1000000; i++)); do
s="$s$i"
done
echo "end"
package main
import (
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
)
func main() {
fmt.Println("1.13.8")
sl := make([]string, 10000000)
for i := 0; i < 1000000; i++ {
sl[i] = strconv.Itoa(i)
}
s := strings.Join(sl, "")
ioutil.WriteFile("out.txt", []byte(s), os.ModePerm)
fmt.Println("end")
}
#!/bin/bash
set -eu
go build -o main_go main.go
go build -o main_go_2 main2.go
choosenim 1.0.2
nim c -d:release -o:main_nim_1.0.2 main.nim
choosenim stable
nim c -d:release -o:main_nim_1.2.0 main.nim
nim c --gc:arc -d:release -o:main_nim_1.2.0_arc main.nim
ls -lah
sect() {
echo "== $1 =="
}
line() {
echo "------"
}
mkdir -p result/{go,nim_1.0.2,nim_1.2.0,nim_1.2.0_arc,python}
for i in {1..100}; do
n=$(printf "%03d.txt" $i)
echo "count: $i"
# Go
(time ./main_go_2) 2> "result/go/$n"
# Nim
(time ./main_nim_1.0.2) 2> "result/nim_1.0.2/$n"
(time ./main_nim_1.2.0) 2> "result/nim_1.2.0/$n"
(time ./main_nim_1.2.0_arc) 2> "result/nim_1.2.0_arc/$n"
# Python
(time ./main.py) 2> "result/python/$n"
# sect Ruby
# time ./main.rb
# line
# sect Bash
# time ./main.sh
# line
done
./aggr.sh
echo "finish"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment