C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: const in と int


(過去ログ 144 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■84380 / inTopicNo.1)  const in と int
  
□投稿者/ もしかして (1回)-(2017/06/24(Sat) 13:52:12)

分類:[.NET 全般] 

[int]タイプより
変数を「const int」として定義するほうは多少実行(計算)が速くなるでしょうか。
----あくまでも理論上。


引用返信 編集キー/
■84381 / inTopicNo.2)  Re[1]: const in と int
□投稿者/ 774RR (531回)-(2017/06/24(Sat) 23:25:58)
数値リテラルを const int に書き直すのであれば速度は同一であろうし
あとから書き換えを禁ずる意図で const int を書いている
(要するにその値は何らかの式評価結果)であるなら速度は同一であろうし

速くなることもあるだろうし、全く変化ないこともあるだろうし
としか言いようがないね。元ソースコードのコンテキスト次第。

引用返信 編集キー/
■84383 / inTopicNo.3)  Re[2]: const in と int
□投稿者/ もしかして (2回)-(2017/06/25(Sun) 11:12:02)
774RR さん
お返答ありがとうございます。

前回質問の仕方が悪かったんで、もう一度やります。

自分が試してやってみたいですけれども、
環境の差から影響されないように、
あくまで一般論あるいはコンパイル理論上の話を聞きたいのです。


例えば、


const int X = a+b;// a,bは前の処理の結果を保存している変数。

int Y = a+b;// a,bは前の処理の結果を保存している変数。

下記の二つの計算どっちが速い? と言う質問です。

double Z = X + X*X + X*X*X + cosX;

double Z = Y + Y*Y + Y*Y*Y + cosY;



宜しくお願いします










引用返信 編集キー/
■84385 / inTopicNo.4)  Re[3]: const in と int
□投稿者/ 774RR (533回)-(2017/06/25(Sun) 20:46:37)
提示ソースだと、実行時に計算する必要がある(コンパイル時に計算できないことが確定している)わけで、
どっちも実行速度は一緒でしょう。

C++11 以後だと、「コンパイル時に値が確定」することをソースコード上で明示する constexpr というのがあって
これを使うと可能な限りのコンパイル時最適化が働いて、実行速度が上がる可能性があるっす。
でも提示例では「実行時でないと値がわからない」ので constexpr は使えないっす。

引用返信 編集キー/
■84390 / inTopicNo.5)  Re[3]: const in と int
□投稿者/ Jitta (304回)-(2017/06/26(Mon) 21:30:34)
No84383 (もしかして さん) に返信

> const int X = a+b;// a,bは前の処理の結果を保存している変数。
>
> int Y = a+b;// a,bは前の処理の結果を保存している変数。
>
> 下記の二つの計算どっちが速い? と言う質問です。
>
> double Z = X + X*X + X*X*X + cosX;
>
> double Z = Y + Y*Y + Y*Y*Y + cosY;
>

これは、その様に見える観測結果があるからの問いなのでしょうか。
この疑問がおこった理由は何でしょう?それを書く方が早いと思います。
引用返信 編集キー/
■84391 / inTopicNo.6)  Re[4]: const in と int
□投稿者/ もしかして (4回)-(2017/06/26(Mon) 21:42:08)

質問の意図:

自分が以下のような二つの問題を知りたいのです。

@ const int で定義している変数とintで定義している変数が計算能率が同じかどうかという事です。
  コンパイラーあるいは計算ユニットは両者に異なる処理方法で処理しているかどうか

A 同様に、unsigned int と int に対する計算する場合、同じ算式であれば、どっちが速い?


理論的なご解説頂ければ幸せです。

引用返信 編集キー/
■84394 / inTopicNo.7)  Re[5]: const in と int
□投稿者/ furu (102回)-(2017/06/27(Tue) 12:15:26)
No84391 (もしかして さん) に返信

「あくまで一般論あるいはコンパイル理論上の話」として

> @ const int で定義している変数とintで定義している変数が計算能率が同じかどうかという事です。
>   コンパイラーあるいは計算ユニットは両者に異なる処理方法で処理しているかどうか

コンパイラが同じ答えになると判断できれば(バレれば)
全く同じ命令を実行するので計算能率は同じになる。

>
> A 同様に、unsigned int と int に対する計算する場合、同じ算式であれば、どっちが速い?
>
CPUにintの加減乗除の命令がなければ
unsigned intのが早くなる。

つまり、コンパイラの最適化の性能とCPUの性能によるので
なんとも言えないと思う。

極端な話、円周率を有効桁3桁で計算するプログラムをコンパイルした時
計算しないで、3.14を出力するかもしれない。

ただ、constを書くことによって、コンパイラにかなりヒントを与えることになるから
書いた方がいい。
引用返信 編集キー/
■84395 / inTopicNo.8)  Re[5]: const in と int
□投稿者/ 774RR (536回)-(2017/06/27(Tue) 13:47:30)
C/C++ の const には「(初期化完了の後は)代入を禁ずる」の意味しかない。
それ以外は非 const と同じであるから、コンパイル時に値が確定していない式の評価に関して言うなら
const int と int では実行時演算速度は同じ(違う積極的理由が無い)

unsigned int と int の速度は違う可能性があるです。

ほとんど全てのコンピュータで2の補数が使われている理由は、
符号あり整数同士、符号なし整数同士の加減乗算に同一命令同一回路が使えるから。
だから加減乗算の速度が違うことはまず無いです。

ですが除算は明らかに処理が異なるので命令も別で、処理時間も異なります。
たとえば今オイラの手元にある RX マイコンの資料によると
符号なし整数除算 DIVU 命令の処理時間は 2-18 ICLK
符号あり整数除算 DIV 命令の処理時間は 3-20 ICLK
浮動小数点数除算 FDIV 命令の処理時間は 16 ICLK
# 整数除算のほうが遅いんだ・・・

x86 の内部処理は難しすぎて解説できないっす。

C/C++ 言語仕様としては
・符号なし整数での演算ではオーバーフローをエラー扱いしてはならない
・符号あり整数での演算ではオーバーフローをエラー扱いしてよい(しなくてもよい)
という違いがあるので(x86 はオーバーフローをエラーにしない仕様)その辺でも差が出る可能性はあります。
どっちが高速かは状況次第で違いそうなのでなんとも言えないっすね。

減算がある場合符号なし数は使いづらいので、一般的用途には符号あり数を使うのが推奨されているです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -