Почему на прохождение 10 миллиардов требуется больше времени, чем на 1 миллиард? - PullRequest
5 голосов
/ 13 ноября 2011

Почему для выполнения этого цикла (до 1 миллиарда) требуется всего несколько звуков ...

for (i = 0; i < 1000000000; i++)
{

}

... но этот цикл (до 10 миллиардов) занимает> 10 минут?

for (i = 0; i < 10000000000; i++)
{

}

Разве это не займет 30 секунд или около того (3 секунды x 10)?

Ответы [ 4 ]

11 голосов
/ 13 ноября 2011

Полагаю, i - это 32-разрядная целочисленная переменная, поэтому она всегда меньше 10 миллиардов (что больше 2 ^ 32), тогда как 1 миллиард все еще вписывается в 32-разрядный диапазон (который заканчивается примерно на 2 или 4 миллиарда, в зависимости от подписи). Хотя я не знаю, как компилятор продвигает эту 10-миллиардную константу, но он, похоже, осознает проблему переполнения и делает ее бесконечным циклом.

Что происходит, когда вы делаете i a long long int (и, возможно, 10000000000 a 10000000000L, но это не проблема)?

2 голосов
/ 13 ноября 2011

Разница в том, что 1 000 000 000 вписывается в 32-разрядное целое число, а 10 000 000 000 - в 64-разрядное.Если это 32-разрядный код, который, как я предполагаю, так и есть, он просто переполнен и приведет к тому, что ваш цикл станет бесконечным.

Является ли ваша i 64-разрядной переменной?

2 голосов
/ 13 ноября 2011

Я полагаю, что вы не помещаете код, который вы отметили здесь.Код как есть может быть оптимизирован компилятором, чтобы вообще не запускаться.Также может случиться так, что i переполнится, и тогда ваш цикл никогда не закончится.

Однако, если вы используете i в качестве индекса для структуры данных (особенно если это массив), то у вас есть памятьподкачка страниц и кэширование данных, которые сильно влияют на производительность.

0 голосов
/ 13 ноября 2011

Если это кому-нибудь поможет:

Когда 32-разрядное число со знаком выходит за пределы диапазона 2 ^ 31 - 1, число интерпретируется как отрицательное число (из-за формата 2C). То есть:

Для 16-битного числа:

  0111 1111 1111 1111 (32767)
+ 0000 0000 0000 0001 (1)
---------------------
  1000 0000 0000 0000  (Shoulbe 32769 but instead is -32768)
+ 0000 0000 0000 0001
--------------------
  1000 0000 0000 0001 (-32767)....

Таким образом, бесконечный цикл состоит в том, что вы просто просматриваете все возможные значения для 32-битного целого числа со знаком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...