処理の高速化なお話 | もっとコンピュータが好きになるblog

処理の高速化なお話

つのまにか,amebloでblogを始めてから一ヶ月経ってました.結構続いてるなぁ.日に日に文章が長くなって読みづらくなってますが,面白そうな内容を引き続き取り上げていきますので,興味持っていただけた方,暇ならまた読みに来てください.



今回の話はプログラマが日ごろから気を使っているけど,なかなか実現が難しい処理の高速化のお話をしたいと思います.せっかく作るソフトウェアなら高速化させたいというのが設計者の希望であると思いますし,ちょっと考えていきましょ.それからプログラムを書いたことない人は,「プログラマにはこんな苦労もあるだねぇ~」ぐらいの勢いで読んでいただければと思います.

まず,高速化すると考えて一番最初に思いつくのが,言語の違いです.プログラムには処理の方式として「コンパイル方式」「インタプリタ方式」という二つの処理が存在します.まずはこの処理の違いについてみてゆくことにしましょう.

コンピュータがもっとも速い処理を行うには,コンピュータにとって分かりやすい状態のファイルでもって処理するのがもっとも速いことになります.これは日本人なら日本語の文章読むのがもっとも速いのと同じことです.んで,プログラム言語で書いた文章をコンピュータにもっとも分かりやすい文章(機械語と呼ばれます)に変換してあげるのが「コンパイラ方式」と呼ばれる処理方法です.一般的に「コンパイル」を行う言語の事を「コンパイラ型言語」と呼ばれ,C言語やC++,Pascalなどといった言語が存在します.

対して一行ずつ翻訳しながら処理を行うものがあります.その処理方法を「インタプリタ方式」と呼びます.インタプリタ方式で書かれたプログラムは,「コンパイル」を行うことなく実行出来るので,ちょっとした作業をやらせたりするのに適しています.しかし翻訳する行為が入っている分,コンパイラ方式よりも処理は遅くなります.一般的に「インタプリタ方式」の言語の事を「スクリプト言語」と呼び,PerlやJavaScriptなどといった言語が存在します.

ここで簡単な例をば.C言語とPerlで書かれた10000回足し算を行う処理プログラムを書いてみたりします.(どちらも同じマシン上で,forによる繰り返し文,実行五回の平均です.)


結果
- C言語
 real 0m0.097s
 user 0m0.014s
 sys 0m0.042s

- Perl
 real 0m0.119s
 user 0m0.018s
 sys 0m0.056s


10000回の足し算程度の簡単なプログラムですが,処理速度に違いが出ているのがわかると思います.これが複雑な処理になるともっと顕著に違いが現れてきます.


次は,繰り返し文と再帰文の違いです.再帰文とは,作った機能の中で自分自身を呼びだし何回も繰り返し実行するといった構造の処理方法です.いまいちわかりづらいかと思いますが,実際のコードにしたらこんな感じになります.


void rc(int j){
 printf("%d\n",j);
 if(j++ > 10000){
  return;
 }
 rc(j);  //ここで呼び出ししてる
}


対して繰り返し文.これは単純でforやwhileといった繰り返しを行うための機能を使って繰り返しの作業を行います.


for(i;i<=10000;i++){
 printf("%d\n",i);
}


再帰と繰り返しですが,再帰処理はメモリ使用領域確保の理由から繰り返しより遅いとされます.(再帰を使いすぎるとオーバーフローする可能性もあります.)上記のコードでは,やることが少ないんで,再帰の方がめんどくさいような気がするかもしれませんが,処理によっては再帰で書いた方が簡単に組める場合もあります.そういった状況に陥った場合も,出来るだけ繰り返しを使う工夫をするというのもアリだと思います.ちなみにC言語で再帰を使った時の速度です.やってる事は最初の例と同じく10000回の足し算ですので,最初のC言語の時の速度と比べてみてください.今回も五回の平均値です.コンパイラ言語がスクリプト言語より遅くなってますね.(再帰する所でif文があるだけ遅かったんですね.)


- C言語(再帰)
 real 0m0.203s
 user 0m0.16s
 sys 0m0.30s


今回は処理速度を重点を置いて考えていきましたが,プログラムの書き方はこれだけが重要な訳ではありません.見やすさ,拡張のしやすさなどあります.今回は長くなってきたのでここまでにして,後日,他のポイントを考えていこうかと思います.


最近のここのblogの記事の内容がややめんどくさい話が多くなってきたようだし,来週は一度方向転換して,笑えるようなネタとかWindowsアプリケーションとか考えていこうかなと思います.まだどんなこと書くか未定ですが.