プロが教えるわが家の防犯対策術!

動画処理をするにあたって、得た画像のピクセルビット(言葉が間違ってたらすみません)から、色情報を取得する関数を作製ました。
そこで処理速度を計ってみたのですが、自作関数を用いないで全く同じ処理をした場合に比べ自作関数を用いると、7~10倍ぐらいの時間がかかってしまいます。
純粋に書く手間を無視して速度のみを必要とする場合は関数を作るよりも毎回同じ処理を書いた方が速くなるのでしょうか?
よろしくお願いします。

A 回答 (3件)

関数呼び出しは、サブルーチンコールのマシン語にコンパイルされます。

cpuはこのときキャッシュに収まらないほど遠いアドレスにジャンプしなければないかもしれませんし、ジャンプの前、リターンの後には、レジスタの待避、復旧もしなければなりません。
つまり、関数呼び出しは大変、コストがかかるのです。
このため、短い処理の場合は、関数にせず、関数マクロで記述するのが一般的なやり方です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
関数呼び出しは、コストがかかるのですね。
処理的には短いので関数にしないでやるようにしてみます。

お礼日時:2005/11/14 11:43

具体的にどんな処理を行っているのか、コンパイラの種類、自作関数の実装等に依存します。

もっと詳しく見てみないと何ともいえません。

一般的には、(インラインでない)関数を使った場合には、呼び出しによるオーバーヘッドが発生します。
具体的には、引数や返却値のコピー、サブルーチンのコールとリターン、C++の場合には、コンパイラによっては、例外処理のためのコードが埋め込まれます。

自作関数というのが、「毎回同じ処理」とおっしゃっているものと同じ内容の処理しかしていないのであれば、インライン関数にすれば問題は解決できるかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
インライン関数にして試して見ます。

お礼日時:2005/11/14 11:49

がると申します。


えっと。取り合えず前提を
・ある共通な処理を関数化する
or
・ある共通な処理を関数化せずコピペする
としますがよろしいでしょうか?

理論的にはコピペしたほうが早くなります。関数化すると、その関数をcallするために、いくつか後ろで処理が走りますので。
ただ実際にはそーゆーことはコンパイラがやってくれます。gccをお使いでしたら、-Oというオプションで指定すると(例:-O3など。コンパイラ毎に違うので詳しくはご利用のコンパイラのマニュアルをご覧ください)そういうことをやってくれます。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
コピペする方が速くなるのですね。
-Oというオプションを指定することができるのですということなので調べてみます。

お礼日時:2005/11/14 11:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!