+=と÷=の処理速度の謎を教えて下さい。
処理速度をQueryPerformanceCounterで調べていて気になったのですが、
変数A = 1; として以下の処理を100万回行いました。
疑問1
A+=1; は A=1+1; より2~3割高速なのに
A/=3; は A=1/3; より3倍弱処理が遅い事。
疑問2
以前割算と掛算は、足し算と引き算の3倍遅いと聞いたものの
A=1+1; A=1-1; A=1/3; A=3*3; がほぼ全て同速な事。
この2点なのですが、後者はただのガセだったのかもですが
前者の結果はどうにもふに落ちず・・。
もしかして後者は/=が遅い事をそう例えたのでしょうか?
何かお解りになられます方、
教えて頂けますと幸いです。
No.3
- 回答日時:
> 疑問1
> A+=1; は A=1+1; より2~3割高速なのに
> A/=3; は A=1/3; より3倍弱処理が遅い事。
Aの型やどんな記憶域期間を持つかにもよりますが、int型の自動変数だと仮定した場合、通常はレジスタに割り付けられるので...
A+=1はインクリメント命令、A=1+1はA=2を意味する転送命令に展開されます。
このとき、転送命令ではオペランド分命令長が長くなりますので、それだけフェッチの時間が余分にかかります(プロセッサのアーキテクチャによっては、もう少し別の要素も絡んできます)。
A/=3は除算命令、A=1/3はA=0を意味する転送命令またはA^=Aのようなビット演算命令に展開されます。
除算命令は整数演算の中では最も時間がかかりますので、単純な転送やビット演算よりはずっと遅くなります。
なお、A/=2のように除数が2のべきである場合は、シフト命令になるので除算命令より高速になります。Aは符号なしの場合、負の値の処理が不要になるのでさらに高速になります。
> 疑問2
> 以前割算と掛算は、足し算と引き算の3倍遅いと聞いたものの
> A=1+1; A=1-1; A=1/3; A=3*3; がほぼ全て同速な事。
A=1+1とA=3*3は、それぞれA=2とA=9を意味する転送命令に展開されます。
一方、A=1-1とA=1/3は、A=0を意味する転送命令またはA^=Aのようなビット演算命令に展開されます。
結果として、A=1-1やA=1/3の方が若干高速になる可能性はありますが、乗除算ほどの差は出ません。
この類の疑問を解消するには、コンパイル結果を実際に調べてみる必要があります。
コンパイラにアセンブリ言語のソースを出力させてもよいですが、命令長を知るには逆アセンブルする方が便利かもしれません。
詳しいご回答ありがとうございます。
コンパイル結果、展開される結果・・色々有るのですね。
逆アセンブル結果を読めれば、どんな内容に変換されたかがわかるのですね。
ご回答ありがとうございました。
No.2
- 回答日時:
訂正
A=3*3; は A=9; としてコンパイルされるの間違いです
訂正ついでに
加算、減算はCPUにそのままの命令があるので速くなります
乗算、除算はCPU命令がない場合、加算、減算の繰り返しになるのでループの分遅くなるはずです
2の階乗の乗除算の場合は特別に最適化されてシフト演算に変換され高速になるかもしれません
(A /= 8 が A >>= 3; としてコンパイルされる)
追加のご回答ありがとうございます。
掛算はそうなるのですか。
加算と減算、乗算と除算、シフト演算 そういう内側の事情が有るのですね。
勉強になりました。とても今後の為になりそうです。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- 発達障害・ダウン症・自閉症 中学の時にIQ82の境界知能と診断されました。 今の私も、やはり境界知能でしょうか? そしてこれは、 3 2023/02/19 00:37
- その他(プログラミング・Web制作) プログラミング 処理速度 1 2022/11/25 11:05
- その他(IT・Webサービス) 高速処理可能な表計算ソフトについて ExcelやGoogleスプレッドシートのような表計算ソフトで、 2 2023/04/29 16:06
- 仕事術・業務効率化 スローライフって、どう思いますか? 1 2022/11/07 03:31
- 派遣社員・契約社員 派遣先にパワハラの相談したら派遣元に速攻でバレた件の続き 3 2022/11/08 22:16
- 物理学 『数か物か』 4 2022/06/13 06:54
- 物理学 時間の進み方の変化について 6 2022/08/14 07:55
- その他(税金) 現時点(23/07/06)において、政府はなぜ再度増税を検討しているのでしょう? 調べてみたところ大 2 2023/07/06 21:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PICマイコンのプログラムについ...
-
VBAでのコントロール操作
-
文字化けはなぜ日本語が入って...
-
【有効数字について】 授業で、...
-
KBのMB違いって
-
KBとMB
-
ワードの改行について
-
ALUのオーバーフローフラグの生...
-
6ビット(符号含む)の二進数
-
GB と Gbの違いの意味
-
16bitはダイナミックレンジが97...
-
K KB MB について詳し...
-
もしコンピューターが2進数か...
-
文字の容量(サイズ)についての...
-
アルファベット30文字は何バイ...
-
ブルーレイディスクの容量に関...
-
データ量の単位について教えて...
-
IBM漢字とUTF-8の変換について
-
ギガバイト メガバイト この違...
-
PDFからワードへ→文字がくずれる
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語FortranとCの違...
-
命令網羅率の計算問題です
-
組み込みCプログラムで実数型
-
VBAでのコントロール操作
-
COM1(RS232C)とUSB仮想COMポー...
-
64ビット化による処理速度低下...
-
なぜ、i++なのか?(ものすごく...
-
H8Sで割り込み発生時の飛び先ア...
-
アセンブリ言語で。
-
MIPS と クロック周波数の換算方法
-
x86系のCPUとは?
-
PICマイコンのプログラムについ...
-
arduino
-
応用情報技術者試験問題の解き...
-
CPUのHTについて教えてください。
-
MFCのエディットボックス上書き...
-
VBSとVBA
-
C言語についてです 整数nを入力...
-
CPU、Z80からステート数から...
-
アセンブラ大至急!!
おすすめ情報