状況によっては、、ループ、またはdo-whileループを互換的に使用できます。 私の友人の1人は、このような状況はdo-whileループを使用すべきだと私に言った。 よりも速く、よりも速いためです。 誰も私にそれの証拠を与えることができますか?Cではどのループが速いのですか? whileループまたはdo-whileループ
答えて
両方のループはほとんど同じです(do-whileは少なくとも1回実行されます)。多くの場合、少なくともx86では同じ命令にコンパイルされます。
次のコード:
int main(int argv, char *argc[]) {
int a = 0;
while (a < 100) {
a++;
}
a = 0;
do {
a++;
}while(a < 100);
return 0;
}
は、このアセンブリを生成します(gcc -S -o temp.as temp.c
を使用して):
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
call ___main
movl $0, 12(%esp) >> while
jmp L2
L3:
addl $1, 12(%esp)
L2:
cmpl $99, 12(%esp)
jle L3
movl $0, 12(%esp) >> do-while
L4:
addl $1, 12(%esp)
cmpl $99, 12(%esp)
jle L4
movl $0, %eax
leave
ret
あなたはリンゴと桃を比較しています。
do-while
とwhile
ループは、それらが提供する機能が異なります。
do-while
は常に1回実行され、while
は条件が真である場合にのみ実行されます。
いずれかを使用できる状況では、パフォーマンスの違いはありません。
疑問がある場合は、自分のプラットフォームで自分自身をプロファイリングするか、両方のアセンブリ出力を分析してください。
@Ais私の質問をもう一度読んでください。私はいくつかの状況では、すべての状況を使用することはできないと言いました。 –
@HabeebPerwad:もう一度私の答えを読んでください。特定の第3パラグラフ。 –
あなたが別のセマンティック(少なくとも一度対多分なし)気をいけない場合があり、変わりはない。
いいえ。C標準は実行速度の要件を提供しないため、一般的に証明することはできません。
最適化されない明白な状況があります。外部関数呼び出しはCライブラリにはありません(コンパイラが '約何かを仮定する)。ループガードが外部コールである場合、一般的に2度呼び出すことは、1度呼び出す場合の約2倍の高価になります。プログラムのパフォーマンス、最適化の効果については、基本的に正しい方向性があります。 – Kaz
@ Kaz:私はあなたの意見を確認するか分からない。特定のプログラムや特定のコンパイラでは、パフォーマンスを予測することが可能であることに同意します。しかし、これは「証明」(HabeebPerwadが求めているように)を構成することはほとんどありません。 – Mankarse
whileとdo-whileとの違いは、条件をチェックせずに常に最初の時間を実行することです。したがってと仮定すると、の条件が実際に真である場合、do-whileはこれを保存します条件のチェック。
これはせいぜいマイクロ最適化です。
C semanticは、最適化の問題が無関係な抽象マシンの動作を記述します。 (C99 Standard、5.1.2.3p1を参照)
コンパイラが最適化できる状況であれば、ループはwhile
ループに従ってください。 Top-of-Loopテストがより明確になりました。その理由は正式な検証に根ざしているからです。 while
ループは、本体の正しい実行の前提条件をテストします。 do
ループは、何もテストせずに本体を一度実行し、その後、対処する必要があります。理由を考えるのはもっと難しいです。私たちは、ループの前に存在していた条件と最初の反復の無防備な実行の結果の結果として状況が何であるかについて考えなければなりません。
ループガードが高価な場合(I/Oを行うことができる外部機能への呼び出しや、他に何が分かっているかなど)、可能であれば、それを下に移動することを検討してください。
- 1. WhileループでdoWhileを変換する
- 2. whileループwhileループwhileループより高速
- 3. より速いwhileループまたはwhileループを実行する人
- 4. whileループのエラーチェックはC++ですか?
- 5. whileループwhileループwhileループ
- 6. 私はwhileループをwhileループの中で使うことができますwhileループwhile PHP
- 7. whileループの最速メソッド
- 8. A Whileループwhileループwhileループ - SQL
- 9. Cでループしていないネストされたwhileループ
- 10. Excel VBA DoWhileループ - 各ループで項目のリストを返す方法は?
- 11. whileループをwhileループで使用する
- 12. forループとwhileループの違いは何ですか?
- 13. Stringstream C++ whileループ
- 14. C do-whileループ
- 15. C++ do-whileループ
- 16. C++ cin.fail()whileループ
- 17. json - whileループがコンマでループする
- 18. whileループがboolでブレークしないC#
- 19. このケースではForループとWhileループの違いはありますか?
- 20. SQL:whileループwhileループ
- 21. whileループにはまった?
- 22. Whileループforネストしたループ
- 23. whileループでは、PHPの
- 24. Cinはwhileループとforループで無視されています
- 25. forループwhileループforループ
- 26. whileループでwhileループを解決する方法は?
- 27. ループで何もしないwhileループ
- 28. C++ switch while default whileループ
- 29. whileループwhile a C++関数
- 30. Whileループは無限です
この議論はありませんでした:http:// stackoverflow。co.jp/q/3347001/694576? – alk
投稿する前に自分自身で重複の有無を確認してください –