Время для компьютеров течет не так, как для людей. То, что человеческим
Инфляция временных единиц
Для большинства программистов прикладного уровня время, которым измеряется производительность программ, останавливается на масштабе миллисекунд: ну какая разница, будет ли элемент в браузере рендериться 50 или 200 микросекунд, если это всё равно ничтожно малое значение? Какая разница, выполняется ли запрос в базу данных за 200 или за 500 микросекунд, если сетевые издержки на порядок больше? Безусловно, есть области программирования, где приходится спуститься на уровень наносекунд и единичных тактов, но в большей своей части программисты не думают такими временными понятиями. Я предлагаю подумать.
Компьютерная секунда
Я предлагаю подумать, как выглядела бы работа современного компьютера, если бы каждому такту процессора соответствовала одна секунда в субъективном мироощущении каких-нибудь существ, которые, как мы знаем, и управляют всей техникой ("гарантийные человечки" или, на современный лад, "фиксики"). Для таких человечков частота процессора будет равно ровно 1 Hz.
Я пишу эту статью на ноутбуке с восьмиядерным процессором базовой частотой в 2.4 GHz, то есть один такт раз в ~0,4 наносекунды (округление очень грубое). Это значение и будет нашей "компьютерной секундой".
Что же происходит за время, равное такой секунде?
-
Восемь ядер процессора успевают выполнить несколько элементарных операций вроде сложения чисел.
-
Свет проходит около 12 сантиметров (в вакууме).
-
За пять секунд процессор может получить данные из кэша первого уровня.
Компьютерная минута
Этот промежуток времени интереснее. За минуту может произойти многое. По человеческим меркам эта минута равна примерно 24 наносекундам.
Что же может произойти за компьютерную минуту?
-
Электрический сигнал пройдет всю длину кабеля от компьютера до монитора.
-
За две минуты произойдет обращение к данным в оперативной памяти.
-
За несколько минут JVM сможет сделать объект String из маленького массива байтов.
Компьютерный час
На этом этапе мы переходим от человеческих наносекунд к микросекундам: компьютерный час равен 1.44 мкс.
За такое время:
-
Может выполниться пузырьковая сортировка небольшого массива, когда-то написанная мной в образовательных целях. (вдумайтесь: если процессор каждую секунду делает по простому действию, то для сортировки маленького массива ему понадобятся часы!)
-
За десяток-другой часов процессор может запросить и получить данные у достаточно производительного SSD.
Компьютерный год
Предлагаю перескочить через сутки и месяцы и сразу перейти к годам (~12мс), за год может произойти очень много разных событий:
-
Запрос, обрабатываемый базой данных несколько месяцев, можно считать быстрым.
-
Примерно раз в компьютерный год должно меняться изображение на мониторе, чтобы соответствовать частоте 60 Hz.
-
Около трех лет уходит на выполнение пинга 8.8.8.8 (три года, Карл! человек за это время может пешком дойти до сервера и вернуться!)
-
Десяток лет может пройти от нажатия на клавиатуру до появления символа на экране монитора.
Компьютерное столетие
Именно на таком уровне (человеческие секунды) мы общаемся с компьютером. Например, главная страница Хабра, будет загружаться около пяти столетий. Вдумайтесь! Полтысячи лет! Если во времена Шекспира начать, секунда за секундой, работать над загрузкой страницы, работа всё ещё может быть не закончена в XXI веке!
Надеюсь, что данный мысленный эксперимент вам показался настолько же захватывающим и невероятным, как и мне. Многие вещи становятся более понятными и осязаемыми, если перевести их в компьютерные секунды. Например, читая "Операционные системы" Танненбаума, я недоумевал, как компьютер может вообще успевать что-то делать, если переключение в/из ядра ОС — такая сложная операция? Но если перевести это в "компьютерное" время, то это всего-то час труда раз в пару месяцев.
Автор: Дмитрий Калач