シルメラ プロジェクト | thilmera project ...       Site Viewer / Auto Update / Version
Windows汎用 多機能システムモニター - あなたの七つ道具
- Download (Japanese) -
Vector 窓の杜
フリーソフト100
- Download (English) -
Softpedia DIGITAL DIGEST
FileCroco MajorGeeks.Com
- Donation -
寄付 - paypal.me
thilmera7s ライセンス
*先日追加されたモニターオフキープ機能は、「モニターオフキープ」を実行しない限りPCに影響を与えることは一切関係ありません。

エンゲージメント
開発録
レビュー
PC周辺機器レビュー / HDD難民
軽さこそ命
ビット逆転の早いコードを目指す
並列処理は軽くなるわけではない
書き方を変えても速くならないコード例
std::vectorのpush_backはとても重い
悩みの種
Visual Studioでファンクションキーが動かなくなった
COMODOジャパンのデジタル署名の実状
strcmpに両方空文字列をいれると0以外を返す
Windows Defender誤検出の原因コード例
雷と停電
  アマゾン情報 - こちらのリンクを通して何らかをご購入頂くことで当サイトの運営、開発を応援頂けます
書き方を変えても速くならないコード例 (2018/03/19)




if( ! i ) と if( i == 0 ) はどちらが速いのか



結論から言うと、-O2オプションでコンパイルされる結果はどちらもアセンブラでは

test rax, rax
jne .L8 ; または真の場合は je .L8

といった感じの2行である。つまりはよく if( i == 0 ) ではなく if( ! i ) にしろみたいに言う人がいるが、ただの好みであってそれ以上の理由はなさそう。

これがたとえば if( i == 1 ) などになると、アセンブラでは

cmp rax, 1
je .L8

という命令に変化する。今度は純粋に比較になるので、たぶん速度は落ちるだろう。
ようは ! i ではなく i == 0 とかくと結果がこうなると勘違いされているのだという事なのだと思う。
少なくとも if( i ) と if( i == 1 ) は違い、前者は test 命令。後者は cmp 命令となるため、この場合は前者のほうが速いのだろうが、それは真偽判定なら。の話で、実際に1か知りたい場合はそもそも if( i ) なんて書いたら大変なことになるので、話の本筋からはそれる。

これから解ることは、少なくとも if( ! i ) ではなく if( i == NULL ) ときっちり書いた場合でも速度は全く変わらないよという事。あとは可読性によるミスをどっちの記述が適切に排除できるかが問題。
なお、if( i ) と if( i != NULL ) も結果は等価。よってあとは可読性の問題。

まあもちろんこれはネイティブ言語の話なので、例えばJavaScriptとかの場合でも本当に変わらないのかというのは知らない。
昔 ! i とかけと言われたことがあったけど、私は真偽判定と数値の判定を間違えないために前者は ! b 後者は i == 0 と必ず書く。


前置インクリメントと後置インクリメントどっちが速いか


for分の3つめでのインクリース部分で、i++ より ++i のほうが速い?

これは同じ。少なくともC言語ではどちらもアセンブラで

add rax, 1

といった一行の命令になる。

前後関係がもっと複雑な場合は i++ より ++i のほうが命令数は少ないらしいが、そこまで気にするほどの差は最適化で消し飛ぶような気がする。


無限ループでwhileとforはどっちが速いか


while(true) { ... } と for(;;) { ... } はどっちが速いか?

結論。どっちも以下の内容になり等価。

sub rsp, 8
.L4:
xor edi, edi
...
jmp .L4


例外 __try { ... }__except(1){ } をつけると遅くなるか


 実測をとったところ、ループ内部で __try { ... } __except (1) { } を入れてみても完了速度に変化が無かった。







Copyright © 弦生ささと(Gakuto Matsumura) All Rights Reserved.