こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

関数内の宣言について

あまりオープンソース等を見たことがないのですが、できるだけ速度を上げたくて、代数を大量に使用する関数の場合
その中の変数にstaticを明確に書いておくと速くなるんじゃないかなと思ったんですが、
単純な処理なのでコンパイラが自動的に選択してるのかなとも思ったのですがどうするべきでしょうか。

投稿日時 - 2009-10-22 22:13:55

QNo.5388682

困ってます

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

>その中の変数にstaticを明確に書いておくと速くなるんじゃないかなと思った

実際にそうなるかどうか、実験してみてはいかがでしょうか。
なお、

>コンパイラが自動的に選択してるのかなとも思った

この文が、staticな変数とそうでない変数をコンパイラが自動的に選んでいる、
と読めばよいのでしたら、内容が誤っています。
staticと人間が書いていないのにコンパイラが自動的にstaticと解釈してくれる、
という都合のいい話はありません。

投稿日時 - 2009-10-22 22:24:52

お礼

ご回答ありがとうございます。

早速、実験してみました。
VC++でDebugモードclass test{int a[1000];};
をclass内の関数で10個ほど宣言してみると
staticをつけた結果/そうでない場合だと30倍ほど速くなっています。
同じくReleaseモードで実行した結果、当然Debugより格段に速くなりますが速度の比は1/2以下に低下いたしました。つまり何らかの最適化が行われているということかなと思いました。

>>コンパイラが自動的に選択してるのかなとも思った

適当に考えたんですが、メモリ領域の保持がなされる(呼び出すときは初期化された状態に)とか思って書きました。

投稿日時 - 2009-10-23 20:09:20

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

考えもなしにstaticにしてしまうと、リエントラント前提で作成された関数の場合に不都合を起こす可能性があります。

参考URL:http://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%88%E3%83%A9%E3%83%B3%E3%83%88

投稿日時 - 2009-10-23 19:45:02

お礼

ご回答ありがとうございます。

シングルスレッドの処理で且つ外部からの呼び出しを一切受けない場合に限るぐらいの条件は考えてましたが、リエントラントというのは設計をするとなると、例えばある関数を意外な所で意外な使用方法をとる必要がでてきたりしそうですから、抽象classとかだと頻繁に考えたりするのかなと思いました。

投稿日時 - 2009-10-23 20:45:59

ANo.2

>その中の変数にstaticを明確に書いておくと速くなるんじゃないかなと思ったんですが、
可能性としては、考えられますが、それがどの位、処理速度向上につながるかは、#1のかたが言われるように実際にやってみた方がよいかと思います。
処理速度を向上させる場合、一般的には、以下のような方法をとります。
1.各処理でどのくらい時間がかかっているかを、各処理毎に計測する。
2.その中で、処理速度に大きな影響を与えているところを探し出す。
(一般的にはその場所をボトルネックと言っています。)
3.そのボトルネックを解消する方法を考える。(アルゴリズムの変更もその中に含まれます)

投稿日時 - 2009-10-23 14:08:40

お礼

ご回答ありがとうございます。

処理速度の向上の必要がある場合、簡単な所なら感覚的に変更しても向上する可能性があると思いますが、計測してみるとか観測的になるべくしてきます。
致命的?な悪影響が出るほどのソースは見たことが無いんですが、ボトルネックは覚えておきます。

投稿日時 - 2009-10-23 20:32:03

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-