は、私はそれだけで走って停止するように見せかけなしに走った、intを長く変更すると実行が高速になるのはなぜですか?
int maxColl = 0;
int maxLen = 0;
for (int i = 2; i < 1000000; i++) {
int coll = i;
int len = 1;
while (coll != 1) {
if (coll % 2 == 0) {
coll = coll/2;
} else {
coll = 3 * coll + 1;
}
len++;
}
if (len > maxLen) {
maxLen = len;
maxColl = i;
}
}
トラブルだった... problem #14 from Project Eulerを解決しようとしていた、そして次のC#を書いていました。
問題の他の人の解決策を探した後、私はintの代わりにlongを使用していたことを除いて、非常によく似たものを見ました。私はこの問題に関係するすべての数値がintの範囲内にあるので、これがなぜ必要なのかわかりませんでしたが、とにかく試しました。
intをlongに変更すると、コードが2秒以上で実行されました。
誰でもこのことを私に説明できますか?
intからlongに変更するだけで、その劇的な違いはありません。 whileループが壊れるのを防ぐオーバーフローがあると思われます。デバッガでそれを見て、どこかにオーバーフローがあるかどうかわからないかどうかを確認してください。 –
通常、Int64はInt32より低速です。ここでオーバーフロー処理があり、Int32が遅くなる可能性があります。 – Ben
@Ben除算といくつかの複雑な操作を除いて通常は同じ速度です。いくつかのシステムでは、符号/ゼロ拡張と64ビット値に変換するためのマスキングが必要なため、32ビット値での動作はさらに遅くなります。説明のためにありがとう –