Swift array map の性能測定の続き

前回の続き

前回の記事に対して@es_kumagai さんからフィードバックをいただきました。
今週忙しくて、やっと見る時間が取れました。

結論から言うと、今回の検証方法(ターミナルからswiftやswiftc を利用する)においては、標準のmapより速い実装が手に入りました。

たった1000件での比較ですが、こうなりました。前回から計測方法も多少改善しました。手抜きですみません。

map : 0.000211954116821289
map7: 0.000133037567138672

まあ1/10000 秒の差とか、もはやモバイル開発においてはどうでもいい話ですね。めちゃくちゃ大量のデータ扱うこともそう滅多にないでしょうし。

ボトルネックはやはりarrayの初期化だったようです。
コードはフィードバックでいただいたものを貼っておきますね。ありがとうございます。

gist.github.com

-O オプション

なお、-OをつけるとDouble値の出力がおかしくなりました。
どうして。。?

$ xcrun -sdk macosx swiftc -O  map.swift
$ ./map 
=== : 0.000318050384521484
map : 0.000821113586425781
map : 5.79357147216797e-05
map7: 3.00407409667969e-05
map : 5.10215759277344e-05
map7: 2.88486480712891e-05
map : 5.10215759277344e-05
map7: 2.62260437011719e-05
map : 4.98294830322266e-05
map7: 2.59876251220703e-05

計測に使用したコードはこちらにあげました。

なおコマンドラインから指定できるコンパイルオプションはこうなっているようです。

  -Onone                 Compile without any optimization
  -Ounchecked            Compile with optimizations and remove runtime safety checks
  -O                     Compile with optimizations

通常は-Onone が使われているようです。

まとめ

ひとまず今回の検証方法においては、標準のmapより速い実装が手に入りました。

ちなみに、Playgroundではこうなります。

map  : 0.181938886642456
map7 : 0.619832992553711

モヤっとしますね。

まだまだ不明点だらけで、勉強しないといけないことが山積みだということがわかりました。

以上です。