Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как быстро может считать компьютер? За какое время он досчитает до 1 млн.?

Программирование+3
Анонимный вопрос
  ·   · 18,8 K
Пишу код и записываю подкаст  · 22 янв 2022  · dreamsorder.simplecast.com
Отличный вопрос! Нам даже не понадобится специальных знаний, чтобы перевести его с "человеческого" на "компьютерный" и довольно точно предсказать результат. Давайте разберемся.
"Человеческое" решение
"Компьютер" в переводе с английского означает "вычислитель", то есть для того, чтобы ответить на вопрос "За какое время мы сосчитаем до миллиона?" необходимо сначала перевести эту задачу на язык вычислений, то есть предельно ясно ответить на вопрос "Каким образом мы считаем до миллиона?" Компьютер действует немного не так, как люди. Скажем, если попросить человека досчитать до миллиона, то скорее всего он поймет задачу так:
Назовем последовательно все числа от одного до миллиона. Когда я скажу миллон, счет окончен.
Решение "Человек с калькулятором"
Компьютер — это не человек, а скорее "калькулятор на максималках". Если бы меня попросили посчитать до миллиона на калькуляторе, то я бы сделал так:
  1. Нажал кнопку "1",
  2. Нажал кнопку "+"
  3. Нажал кнопку "1"
  4. Нажал кнопку "=" -> на дисплее отобразилось "2"
  5. Нажал кнопку "=" -> калькулятор в этом случае к текущему значению "2" применяет опять операцию "+1" -> на дисплее отобразилось "3"
  6. (Да, вы угадали) Нажал кнопку "=" -> на дисплее отобразилось "4"
  7. ...
И нажав оставшиеся 999996 раз я наконец увидел "1000000" на дисплее и сказал: "Я досчитал".
"Компьютерное" решение
"Человек с калькулятором" это уже почти "процессор"🤖. В этом решении человек нам нужен только для того, чтобы нажимать на кнопки и смотреть на экран, чтобы быть в курсе, досчитали ли мы до миллиона или ещё нет. Если же мы хотим "человека" из счёта исключить, то нам на помощь придёт специальная команда, которую не найдешь на калькуляторе, зато есть у каждого современного процессора: сравнить два числа. А ещё у процессоров, в отличие от калькуляторов, нет экрана, зато есть регистр — кусочек памяти внутри процессора, где может лежать ровно одно число, то самое число, которое мы видим на экране калькулятора, когда он считает.
Таким образом, если мы хотим сосчитать до миллиона прибавляя по единице каждый раз, набор команд для процессора (или программа) будет выглядеть так:
  1. Положить в регистр число 1
  2. Добавить к регистру единицу
  3. В регистре миллион?
  4. Если нет, вернуться к шагу 2
  5. Если да, то счет закончен
Процессор сам по себе без интеллекта и исполняет команды в порядке очереди и прыгает вперёд или назад по списку команд, если его об этом просят. Для того, чтобы посчитать до миллиона процессору согласно такой программе придётся "покрутиться" в буквальном смысле: прыжок с команды №4 на №2 придется повторить 999999 раз прежде чем процессор дойдёт до команды №5 и скажет нам "Я посчитал!".
Кстати, всего в данной реализации задачи процессору нужно будет выполнить чуть более трех миллионов команд, прежде чем мы закончим.
Так сколько времени нужно, чтобы посчитать до миллиона?
Мы смогли разложить задачу на простейшие операции — команды, которые понимает процессор без дополнительного переводчика с "человеческого" на "процессорный". Ответить на вопрос, сколько времени займёт такая задача у процессора теперь будет довольно просто.
Хорошим приближением к скорости исполнения команд считаться такое: одна команда в процессоре выполняется за один "герц". Типичный процессор ноутбука или настольного компьютера сейчас работает в диапазоне 2-5 гигагерц, то есть 2-5 миллиардов команд в секунду — так примерно можно переводить с технического сленга слово "гигагерц". Давайте для ровного счёта остановимся на трёх гигагерцах — трёх миллиардах команд в секунду. Мы прикинули раньше, что нам нужно исполнить 3 млн. команд, так что при возможности исполнить 3 млрд. в секунду нам потребуется подождать всего одну тысячную долю секунды, чтобы дождаться ответа от компьютера "Я посчитал!".
Но можно ли быстрее?
Конечно, можно и быстрее. Если перевернуть счёт с ног на голову и считать с миллиона до нуля, то можно соединить вместе инструкции №3 и №4, потому что в большинстве компьютеров есть специальная инструкция "сравнить с нулём и прыгнуть, если результат ноль (не ноль)". Такая программа будет выглядеть так:
  1. Положить в регистр число 1000000
  2. Уменьшить регистр на единицу
  3. Если в регистре не ноль, вернуться к шагу 2
  4. Счёт закончен
Выкинув одну операцию мы уменьшили число инструкций с примерно трёх миллионов операций, до двух миллионов. А значит такая программа закончит работу через 0,000666 секунд, а не через 0,001 секунду. Но к сожалению и понять такую программу будет несколько труднее, чем первую — обычная ситуация при оптимизации программ (так называют усилия, чтобы сделать программу как можно быстрее или компактнее).
А ещё быстрее?
Ещё быстрее — вряд ли. Если конечно не сделать специализированный процессор, который умеет быстро делать ровно одну вещь — считать до миллиона. Такой процессор, думаю, способен уложиться даже за миллионные доли секунды, только вот в Fortnite на нём поиграть не получится, да и зайти на Яндекс.Кью тоже.
Если ваша задача допускает такое, что два процессора будут считать одновремено: скажем один считает от 1 до 500 тыс., а другой от 500 тыс. до миллиона, то можно выжать немного скорости из современных многоядерных процессоров. Такая задача очень хорошо распараллеливается, то есть можно ожидать, что 8-ядерный процессор сможет справиться в 8 раз быстрее, чем одноядерный за счёт того, что вычисления будут выполняться параллельно, то есть независимо на каждом ядре процессора.
Вместо выводов
Компьютеры и в правду очень быстрые. Настолько быстрые, что инженеры сетуют, что сигналы внутри процессоров распространяются "всего лишь" со скоростью света (а быстрее света вообще ничего нет). Однако человечество уже почти исчерпало все возможности, чтобы сделать компьютеры быстрее. Поэтому самый трудный вопрос на сегодняшний день это как быстрее всего посчитать ту или иную задачу; как бы взять и сэкономить в программе пару команд или избежать долгих путешествий в "память" за необходимыми для расчётов данными.
«Порядок снов» в ТелеграмеПерейти на t.me/dreamsorder
1 эксперт согласен
По образованию физик, работаю программистом  · 13 янв 2022
За долю секуды. Добавление единицы в регистр занимает 1 или 2 такта (не помню), соответственно, если частота процессора 4 гигагерца, он может выполнить от 2 до 4 миллиардов добавлений в секунду. То есть, миллион добавлений... Читать далее
1 эксперт согласен
Очень зависит от языка/реализации - на ассемблере может и да, а в другом случае одно добавление со всеми... Читать дальше
Программист, Технолог, Конструктор, Инженер...  · 13 янв 2022
Мой ноутбук сосчитал до 1 миллиарда за 0,26 секунд. Значит до миллиона посчитает в 1000 раз быстрее за 0,00026 секунд (неудобно засекать такой маленький промежуток времени). Процессор i7-8750H 2.20GHz 2.21GHz Оперативка... Читать далее
1 эксперт согласен
IT, технологии, машинное обучение, экономика...  · 29 янв 2022
Прикольный вопрос для кругозора. Насколько я смог разобраться, скорость современного 64 битного процессора (одного ядра, думаю не будем такую простую задачу распараллеливать) дает возможность произвести 1 млрд. операций в сек... Читать далее