1

UVaLOjなどの競技用プログラミング サイトで練習していたところ、プログラムに不要なループを挿入していることに何度か (10 回以上!) 気づきました。

for (int _delay = 0; _delay < 500000000; _delay++ );

通常よりも速く (!) 実行され、より良いランクが得られます。何度も再提出しましたが、この現象が続いています。私の質問は、これはどのように可能ですか? 単なる偶然(何度も起こった)か、コンパイルされたプログラムが何らかの理由で最適化されているのでしょうか?

4

2 に答える 2

3

ほとんどのコンパイラは、あなたが言及した次のステートメントを無視すると思います。

for (int _delay = 0; _delay < 500000000; _delay++ );

for ループは for ループ内にのみスコープがあるローカル変数を変更するだけなので、何もしません。

上記のステートメントに関しては、プログラム全体が高速になります...それができるとは思いません...

于 2013-08-16T19:39:28.277 に答える
0

このような無駄なループがコンパイルされたコードに何らかの影響を与えると仮定すると、パフォーマンスの違いの 1 つの原因は、異なるバケットに分類される分岐命令である可能性があり、CPU での分岐予測がより正確になります (「役に立たない MOV 命令を導入すると、タイトなループが高速化される理由」を参照してください x86_64組み立て?)ただし、適切なテストを行うには、制御された環境でプログラムを実行する必要があります。オンライン審査員による測定値は信用できません。

于 2013-08-17T07:20:58.207 に答える