• ベストアンサー

自作関数の処理速度

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

質問者が選んだベストアンサー

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

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

B3wallace
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

具体的にどんな処理を行っているのか、コンパイラの種類、自作関数の実装等に依存します。もっと詳しく見てみないと何ともいえません。 一般的には、(インラインでない)関数を使った場合には、呼び出しによるオーバーヘッドが発生します。 具体的には、引数や返却値のコピー、サブルーチンのコールとリターン、C++の場合には、コンパイラによっては、例外処理のためのコードが埋め込まれます。 自作関数というのが、「毎回同じ処理」とおっしゃっているものと同じ内容の処理しかしていないのであれば、インライン関数にすれば問題は解決できるかと思います。

B3wallace
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 えっと。取り合えず前提を ・ある共通な処理を関数化する or ・ある共通な処理を関数化せずコピペする としますがよろしいでしょうか? 理論的にはコピペしたほうが早くなります。関数化すると、その関数をcallするために、いくつか後ろで処理が走りますので。 ただ実際にはそーゆーことはコンパイラがやってくれます。gccをお使いでしたら、-Oというオプションで指定すると(例:-O3など。コンパイラ毎に違うので詳しくはご利用のコンパイラのマニュアルをご覧ください)そういうことをやってくれます。

B3wallace
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CPUを二個積めば処理速度は倍になる?

    自作パソコンの場合できるかどうかは知りませんが P4のCPUを二個以上積めば処理速度はそれだけ上がるのでしょうか? それとCPUと言うのは高ければ高いほうが良いのでしょうか?何かデメリットはありますか?

  • 待ち行列モデルの、処理速度2倍と窓口2つの違い

    質問1) http://www.objectclub.jp/technicaldoc/monkey/s_wait ・窓口が1つで処理速度が2倍になったの場合 ・窓口が2つの場合 の比較についてなのですが、上記サイトによれば「処理速度2倍」の方が待ち時間が短くなり速いという結果になっています。 現実にこのようなことがありえるのでしょうか。 いまいちイメージがつかめません。 窓口が2つになった場合でも2倍の速度で待ち人数が処理されていき、待ち時間はほぼ同等になるのではないかと考えています。 ポアソン分布が前提なために起こる現象なのでしょうか。 質問2) 両者とも、待ち人数=0.67人分となっていますが、 窓口1つ処理速度2倍・・・1列に0.67人 窓口2つ・・・1列あたり0.335人が2列分 の認識でよろしいでしょうか?

  • 64ビット化による処理速度低下の要因について

    64ビット化による処理速度低下の要因について Visual C++ 2008で作成した32ビットアプリケーションを ネイティブなx64アプリとしてリビルドし、Windows7マシンで両者を比較したところ、 32ビット版に比べてx64版は実行処理速度が20%ほど低下してしまいました。 ソースは公開できませんが、30万行程の音声解析アプリケーションです。 どのサイトを見ても、x64版アプリの実行速度は多くの場合向上が見込まれる、 としか書かれていないのですが、速度が低下する要因としては何が考えられますか? 一般的なことで構いませんので、ご存知でしたら教えてください。

  • 自作アニメーションの作り方

    自作アニメーションを作ろうと思っています。10分ほどですが。ビスタサイズで作るつもりです。 A4サイズの原画、背景画を,白黒の線だけでなく、色をつけて,スキャンする際、スキャナーのピクセルの大きさは? また、スキャンの後、イラストレーターなどで、原画、動画をつくる際、レイヤーを重ねた後の動画の保存のピクセルは?jpgでよいのでしょうか?撮影、編集の前の過程のことです。 大きなスクリーンでみても、質が劣らない,最低限度のピクセルを教えてください。宜しくお願いいたします。

  • ノイズ処理の原理

    カラー画像からある色の抽出を行うに当たって、ノイズ処理を行うことになり、ネットで検索をし処理方法を見つけてきました。 環境はVC++上でOpenCVというC言語のライブラリーを使用しています。 処理方法は、openCVの関数を使用し cvPyrDown( imgA, imgB, 7 ); // 7 ピクセル縮小 cvPyrUp( imgB, imagA, 7 ); // 7 ピクセル拡大 といった 前画像に対して、7ピクセル縮小処理を行い、結果画像に対して7ピクセル拡大することによって、ぼやけた感じの画像が完成し、色抽出がうまくできました。 しかし、何故この方法でうまく出来たのかの原理がいまいち分からずすっきりしていません。 よろしければ、誰か理由を教えていただけないでしょうか??

  • 32bitと64bit

    すみません。質問させてください。 以前4ビットと8ビットでは一度に処理できる能力が、0と1の組み合わせで行うため、単に倍ではなく4ビットが16に8ビットは256の処理の差が出ると聞いたのですが、32ビットのCPUに対し64ビットのCPUを使った場合は処理速度的にはなぜ2倍なのでしょうか?

  • PHPで画像処理

    あるWebサイトにある画像を定期的に取得して,PHPで画像を処理をしてサーバーに保存するプログラムを作ろうとしています. 処理したい画像の形式はGIFです.特にGIFにこだわりはないので違うフォーマットに変換してから処理してもいいとは思っています. 画像処理と言っても,特定のRGB値のピクセルを画像中から探して,その座標を取得するという単純なものなのです. そんなに難しくなさそうなのですがどうやればいいかわからないのでどなたか教えていただけませんか? GDやImageMagickが使えるのかと思って動かしてみましたが,結局使えそうな関数がみつからず頓挫しています. どなたかよろしくお願いします.

    • 締切済み
    • PHP
  • 動画の再生速度を変えて保存し直したい

    動画ファイルを1.5倍程度の速さに変更して再生はできるのですが、それを再生速度を変更した状態でファイルを保存し直したいです。 今は、動画再生ソフトで1.5倍速くらいにして、それを動画キャプチャーソフトを使ってわざわざ保存していますので、時間と手間がかかっております。 これを、ファイルを一発変換できるようないい方法(ソフト)などがあれば是非教えて下さい。

  • 連想配列でこういう処理をする関数を探しています

    PHP5.2.4を使用しています。 どういうふうに説明してよいのか分かりませんが、 $arr = array(  'key1' => array('value1'=>1,'value2'=>11),  'key2' => array('value1'=>2,'value2'=>22),  'key3' => array('value1'=>3,'value2'=>33), ); という連想配列を例えばキー'value2'の値だけが欲しく、 $arr = array(  'key1' => 11,  'key2' => 22,  'key3' => 33, ); と、変換したいのですが、そのような関数はあるのでしょうか? またこのような処理をする関数を自作する場合、 どのような関数名が適切でしょうか?(array_○○○)

    • ベストアンサー
    • PHP
  • 自身のセル番地を取得する関数の自作

    Excel VBAで以下の処理を行う関数を作成したいと思っていますが、 実装方法がわかりません。 <要求> 次の数式と同様の結果をもたらす関数を自作したい。 =ADDRESS(ROW(),COLUMN()) <作成しようとしている関数のイメージ> Function getCurrentAddress() As String ~~~ 処理 ~~~ End Function <期待する結果> セル番地:C4のセルに関数を入力した場合 =getCurrentAddress() -結果- C4 どなたか、解決方法をご存知の方 ご教示いただけますか?