Symfoware

Symfowareについての考察blog

Nim デバッグビルドとリリースビルドの実行速度

Nimで郵便番号と住所をデータベースに登録するプログラムを作ってみました。
Nim トランザクションを使用し、郵便番号と住所情報をMySQLに登録する

ふと、デバッグビルドとリリースビルドで実行速度が違うのか気になったので調べてみます。
また、参考として同様のPythonプログラムの実行速度も見てみます。

Python



PythonからMySQLへの接続はmysql-connector-python-rfを使用しました。
プログラムはこんな感じになりました。


  1. import codecs
  2. import mysql.connector
  3. def mystrip(s):
  4.     return s.strip('"')
  5. con = mysql.connector.connect(
  6.     host = 'localhost',
  7.     port = 3306,
  8.     user = 'admin',
  9.     password = 'P@ssw0rd',
  10.     database = 'sample',
  11. )
  12. con.autocommit = False
  13. cur = con.cursor()
  14. zipcodeSet = set()
  15. with codecs.open('KEN_ALL.CSV', 'r', 'CP932') as f:
  16.     for line in f:
  17.         # カンマで分割
  18.         data = line.strip().split(',')
  19.         # 2番目:郵便番号
  20.         zipcode = mystrip(data[2])
  21.         # 6,7,8番目:住所
  22.         address = mystrip(data[6]) + mystrip(data[7]) + mystrip(data[8])
  23.         # 郵便番号の重複チェック
  24.         if zipcode in zipcodeSet:
  25.             print("skip " + zipcode)
  26.             continue
  27.         zipcodeSet.add(zipcode)
  28.         # 登録実行
  29.         cur.execute("INSERT INTO post (zip_code, address) VALUES (%s, %s)", (zipcode, address))
  30. con.commit()
  31. cur.close()
  32. con.close()







実測



データベースへの登録が最も時間がかかりそうなので、
あまり差がでないかもしれませんがテストしてみます。

Nimのバージョンは0.18.0。
Pythonのバージョンは3.6.5です。

デバッグビルドでコンパイル。


$ nim c sample.nim



timeコマンドで時間を計測します。


$ time ./sample
real    0m22.027s
user    0m4.703s
sys    0m1.706s




次にリリースビルド。


$ nim c -d:release sample.nim
$ time ./sample
real    0m18.933s
user    0m1.613s
sys    0m1.557s



ちゃんと高速になりましたね。
※3回測定しましたが、概ね同様の実行時間でした。

最後にPython。


$ time python3 comp.py
real    0m33.222s
user    0m10.633s
sys    0m3.123s




データベースへの登録処理なんで差は出ないだろうと思っていましたが、
Nimで書くと高速に処理されますね。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/08/27(月) 23:32:12|
  2. nim
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ