カテゴリー : 2012年 1月5日

直感的に速い処理、遅い処理


プログラミングをしていると、この処理は速くできるなとか、この処理は時間がかかるはず、というのが直感的に分かるようになってくる。これはきっと時間のかかる処理になっちゃうんだろうな、という箇所にさしかかってくると、指がイヤイヤをするようになる。この、他の人に説明しても分かってもらえないような感覚は、多くのプログラマが持っていると思う。

で、何が速くて何が遅いかってのは、プラットフォームによって異なる。例によってうちの得意なのはiOSなので、iPhoneで速い処理、遅い処理を、ぱっと思いつくものを並べてみよう。

  • ネットワーク処理。これは遅いね。どうにもならないほど絶望的に遅い。えー、ネットワークは最近充分に速いじゃない、と思っているそこのあなた。コンピュータの中の世界は基本的にミリ秒の世界だ。1秒もかかるようだったら、それは絶望的な遅さだ。例えるならば、ローカルファイルにアクセスするのとネットワークファイルにアクセスするのは、電話で話をするのと郵便で話をするくらいに違う。「もしもし」と書いて郵便を送る。「はいはい」と返事が郵便で来る。「元気?」と書いて郵便を送る。「ボチボチだね」と返事が郵便で来る。ネットワークアクセスってのはこのくらいのスピード感だな。

    遅いからダメなのではなく、遅いからそれに見合ったプログラミングをする必要がある。非同期にするとか、プログレスインディケータを回すとか、キャンセルボタンを用意するとか。

  • ファイルアクセス。これは速い。特にiPhoneやiPadは、Macに比べれば全体的に非力なマシンなんだけど、ファイルアクセスは充分に速い。これが遅い場合は、ファイルを一度に読み込んでメモリに展開して使い回すとかの技が使うんだけど、そんなものは必要ないくらい。これはHDDじゃなくてフラッシュを使っているのが大きく貢献していると思われる。
  • グラフィックス処理。これは遅かったり速かったり。どこで分かれるかというとGPUを利用できるかどうかにかかっている。たとえば、オフスクリーンでUIImageを作るとする。ビットマップコンテキストを作って、そこに描画して、UIImageに変換。これは時間がかかる。フルスクリーンの画像を作ると0.5秒くらいかかってしまう。でもこれを一度画面に表示してやって、拡大縮小や回転を行うと、これは速い。画像はQuartz内部でOpenGLのテクスチャに変換されるんで、GPUの恩恵を受けられる。だから画面に表示されるまで少し我慢してもらえば、後はサクサク動かせる。
  • 画像処理。これもGPUの影響が大。もしビットマップを1ピクセルずつ変更するような画像処理を、ソースコードを連ねてCPUでやろうとしたら、えらい時間がかかる。でも、Core ImageやAccelerateフレームワークといった適切なものを使えば、チョッ速になる。自分で書くな、フレームワークに任せろ、ってことだ。
  • テキスト処理。エンコーディングの変換とかXMLパースとか。以外に遅い。これは純粋に整数演算になるんで、CPUの処理速度に依存する。だからiPhone 4Sなら速いけど、iPhone 3Gとか持ってこられると遅くなる。どの機種に合わせて書くか、ってことが重要になる。

他にもフォント周りとか、データベース周りとか、動作速度を気にするところはたくさんある。この辺りでも、経験を積むとどうすれば速くなってどうすると遅くなるのかが分かってくる。パッと見て重いかなという処理があっても、GPUやフレームワークを上手に使うと直感よりも速くできるときもある。自分の思い込みが修正されて、直感力が上がってくると楽しいね。