より速いもの:ループを追加するか、ループを追加するか(C#)? 私はどのような高速:ループの追加またはループの追加ですか?
int a=0;
for (int i=1;i<4;i++)
a+=2*i;
または
int a=0;
a+=2*1;
a+=2*2;
a+=2*3;
より速いもの:ループを追加するか、ループを追加するか(C#)? 私はどのような高速:ループの追加またはループの追加ですか?
int a=0;
for (int i=1;i<4;i++)
a+=2*i;
または
int a=0;
a+=2*1;
a+=2*2;
a+=2*3;
、
n | 0 | 1 | 2 | 3 | 4 | 5
--------------------------------
a | 0 | 2 | 6 | 12 | 20 | 30
閉形は、これは常にブルートフォース手法よりも効率的であろう
a = n(1+n);
、です。効率が問題でなければ、閉じたフォームはまだ読みやすくなります。
閉鎖されたフォームを処理する時間がない場合、最短の繰り返しを除いて、ループのタイピングは少なくなります。それで、私たちはそれらを言語で持っているのですよね?
アルゴリズムを改善することは、常にマイクロ最適化よりも優れています(特にプロファイリングなしで行った場合) – schnaader
を意味しますが、使用するクロック・サイクルの数を占めている場合、ループのない実装は
int a=0; - 1
a+=2*1; - 1
a+=2*2; - 1
a+=2*3; - 1 (1+1+1+1 = 4 clock cycles)
として
int a=0; - 1
for (int i=1;i<4;i++) - 11
a+=2*i; (1+11 = 12 clock cycles)
どこので、高速であります
しかし、クロック周波数はギガヘルツであり、これはほとんど無視でき、コンパイル時にコンパイル時に最適化されたバージョンのコードを再アセンブルするので、実際には問題になりません。この進行の
これはコンパイラの最適化を完全に無視し、各ステップで必要となるクロックサイクルについて多くの仮定をしています(例:なぜa + = 2 * 2;は1サイクルのみですか?) – UnholySheep
他のクロックおそらくより論理的な用語が良いでしょう。 – Jodrell
違いはありません。可読性と保守性だけが重要です。したがって、ループを使用してください –
現代のCPUでは、ループブランチは無料であるため、違いは見られません。彼らがいなくても、あなたは非常にばかばかしいループを繰り返して違いを見なければならず、シリアル実行はオプションではありません。 – Sefe
スピードを使いたい場合は、ブルートフォースではなく数式を使用します。 – Jodrell