React Nativeで使うために高速フーリエ変換のためのコードをJSで書いていたんですが、色々とあってiOSネイティブで作り直してみるということがありました。
同様のコードをSwiftに移植して、さぞ速くなるだろうなーと思ったら激遅。JSだと1〜2秒ぐらいで終わっていた処理が6秒ぐらいかかるようになりました。
実際にはもっと大きいデータを扱いたいのですが、Swift版で動かしてみると5分〜10分程度かかってしまうという自体になりました。どれだけ実装悪いんだろう、と悩みました。
でもその前に、デバッグビルドであることを少し疑ってみました。きっと余計な情報が色々あるんだろうと。最適化したら速くなるだろう、と。
そこでXcodeでDebugビルド時の最適化オプションを元々の-Onone
(No optimization)から-O
(Optimize for Speed)に変えてみました。
そうしたら、6秒程度かかっていた処理が0.1秒で終わるように。
続いて本当に処理したいサイズのデータでもやってみると、10秒しないうちに処理が戻ってきてくれました。すばらしい。さすがにJSより遅いわけないもんね。
当初は実装に難ありかと思っていましたが、ひとまず実用に耐えうるレベルだということがわかったので方針を変えなくてよさそうです。
ちなみにSwiftでの時間測定はこちらの方法を参考にしました。
JS書いていたFFTのコードはこちらを参考に書き直したものを使いました。今回のSwiftのコードはさらにそのJSを書き直したものです。