Время для компьютеров течет не так, как для людей. То, что человеческим мозгом воспринимается как мгновение, для компьютеров растягивается на долгие эпохи. Данная статья — это метафора, в попытке осознать этот простой и в общем-то очевидный факт.
Инфляция временных единиц
Для большинства программистов прикладного уровня время, которым измеряется производительность программ, останавливается на масштабе миллисекунд: ну какая разница, будет ли элемент в браузере рендериться 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 веке!
Надеюсь, что данный мысленный эксперимент вам показался настолько же захватывающим и невероятным, как и мне. Многие вещи становятся более понятными и осязаемыми, если перевести их в компьютерные секунды. Например, читая "Операционные системы" Танненбаума, я недоумевал, как компьютер может вообще успевать что-то делать, если переключение в/из ядра ОС — такая сложная операция? Но если перевести это в "компьютерное" время, то это всего-то час труда раз в пару месяцев.
Комментарии (60)
alan008
16.09.2021 11:02+24Самое грустное в этой части то, что человек (чаще программист), привыкший общаться с компьютером на уровне столетий, когда реализует свою задачу, не задумывается, выполняется его код за 1 месяц или за 10 лет — на уровне столетий эту разницу совсем не видно. Про premature optimization прошу не писать, это всё известно. Тут как раз суть в том, что все привыкли как раз НЕ оптимизировать заранее, а потому чаще пишут неэффективно. А потом при увеличении например входных данных в 10 раз разница между 10 лет и 100 лет уже становится ощутимой (хотя между 1 месяц и 10 месяцев она была бы не видна, и это было бы более эффективным решением).
KvanTTT
16.09.2021 14:19+10Проблема в том, что тормозить может не то место, которое оптимизируют. Разница незначительна, если оптимизированный код будет выполняться месяц вместо года, когда другая смежная вещь выполняется десятки лет.
Aleksandr-JS-Developer
16.09.2021 17:02+8Мы наблюдаем общество, которое все больше зависит от машин, но при этом использует их все неэффективнее. (c) Douglas Rushkoff
kuznetsovkd
17.09.2021 02:32+6Если бы мы выжимали из всего максимум эффективности, то вы бы до сих пор ковыряли землю очень эффективной палкой.
Желание получить максимум результата за минимум времени приводит к новым технологиям.
Отличный пример это Intel, пока они выжимали 14нм тех процесс, TSMC обогнала их по всем фронтам.Xenotester
17.09.2021 11:13Ничего интел не выжимали - они просто застряли с 14нм, не в силах освоить и наладить более прогрессивные техпроцессы. Не путайте желание выжать из палки максимум с невозможностью сделать лопату
kuznetsovkd
17.09.2021 13:06+2они просто застряли с 14нм, не в силах освоить и наладить более прогрессивные техпроцессы
Так в этом и проблема, получив проблемы при переходе на новый тех процесс, они вместо того что бы тратить ресурсы на новую технологию начали наращивать эффективность старой. И в итоге отстали от всех.
А смысл остаётся тот же, доводить эффективность до максимума не эффективно.EmmGold
19.09.2021 19:04+1Интел давно похоронили x86, но всплыл amd64. Который убил итаниум и вынудил интел тыкать палкой в труп ещё 20 лет. Кушать-то хоцца.
CrazyScientist
16.09.2021 20:46+5Так когда данные вырастут в сотни раз, тогда и оптимизировать можно начинать. Код есть. Изначально надо решить задачу, можно вообще на питоне полчаса считать, получить результат и забыть о коде. А оптимизировать можно полдня чтобы оно считалось не полчаса а минуту, но в итоге времени потрачено будет в 10 раз больше.
nixtonixto
17.09.2021 08:29+3Проблема в том, что программисты переходят на более высокоуровневые языки, вплоть до интерпретируемых. Это увеличивает скорость разработки и снижает количество ошибок, но уменьшает возможность оптимизации. Пустое окно с кнопкой на Дельфи может скомпилироваться в мегабайтный файл, и до пары кБ, как у краков с музыкой и анимацией, его никак не соптимизировать…
urvanov
17.09.2021 10:09+3Проблема скорее в том, что у программистов ограниченный срок жизни, да и у бизнесовых задач тоже.
ValdikSS
17.09.2021 15:39+2Пустое окно с кнопкой на Дельфи может скомпилироваться в мегабайтный файл, и до пары кБ, как у краков с музыкой и анимацией, его никак не соптимизировать…
Написал десятки кряков с музыкой на delphi, с использованием winapi — файлы были по 10-20 КБ.
shyneko
22.09.2021 16:20А слышали о библиотеке kol? https://wiki.freepascal.org/KOL. Музыку сами писали?
ValdikSS
22.09.2021 18:01+1Да, слышал, но никогда не пользовался. Музыку какую-то сам писал, какую-то воровал. Для Delphi был модуль воспроизведения XM-треков, который добавлял программе всего пару килобайт.
Akon32
17.09.2021 11:28+4Самое грустное в этой части то, что человек (чаще программист), привыкший общаться с компьютером на уровне столетий, когда реализует свою задачу, не задумывается, выполняется его код за 1 месяц или за 10 лет — на уровне столетий эту разницу совсем не видно.
Почему грустное? Просто особенность работы, обусловленная взаимодействием человека с техникой. Нет разницы, если кнопка в бизнес-приложении реагирует на мышь за 0.1с или 0.001с. И в тоже время есть разница, когда 1 доступ к диску занимает 0.1с или 0.001с. В первом случае человек не способен генерировать нажатия кнопки быстрее, чем раз в ~1c, во втором - 1000 чтений диска желательно завершить раньше (и тут всплывает вопрос, почему современные компьютеры жрут память. краткий ответ: кэширование).
Тут как раз суть в том, что все привыкли как раз НЕ оптимизировать заранее, а потому чаще пишут неэффективно.
Мне нравится применять в таких случаях эволюционный подход. "Программисты, оптимизирующие код заранее, не смогли завершить проект
и умерли от голода. Остались прагматики, кто пишет минимально рабочий быдлокод!" Конечно, я не могу отговорить вас от оптимизации, но, если вы видели подобного рода факапы, качественная оптимизация кода уже не кажется безусловно хорошей.
alan008
16.09.2021 11:05+4Тут еще неплохо было бы привести аналогичное сравнение для разных типов обращений — обращение к кешу процессора такого-то уровня, обращение к данным в оперативной памяти, обращение к данным на SSD диске NVME, обращение к данным на SSD диске SATA, обращение к обычному HDD, обращение по локальной сети (один сетевой запрос), обращение по Интернету (один сетевой запрос).
babayota_kun Автор
16.09.2021 11:08+4Да, можно было бы составить длинную таблицу по конвертации времени, это было бы интересно. Суть статьи именно в том, что разница между нс, мкс и мс, почти не ощутимая в прикладном программировании, на самом деле очень существенная
charypopper
16.09.2021 11:53Время - это ведь субъективное восприятие, у нас тоже есть время между откликом от органов к мозгу, и они сопоставимы с описанными в статье промежутками у процессора. Вернее было бы сравнивать скорость реакции нейронки на входные данные и выполнение каких-то задач, возможность коммуникации на одинаковых "скоростях" с человеком, при текущем уровне железа и его развитие по закона Мура того же
0x131315
17.09.2021 08:33http://femto.com.ua/articles/part_2/2483.html
Только у человека все намного медленнее.
Скорость распространения информации в магистралях около 100м/с, в периферии около 2м/с, это при общей длине всех путей в сотни тысяч километров. Не удивительно, что до некоторых только на второй день доходит.
Частота в магистралях до 500гц, в периферии в основном сильно ниже.
pda0
16.09.2021 12:17+6человек за это время может пешком дойти до сервера и вернуться!
Кажется пора писать очередные поправки к RFC 2549…
Chupakabra303
16.09.2021 12:43+2Важно не то, что там происходит все очень быстро, А кто хозяин всего этого процесса. Весь этот титанический пласт уровней абстракций над быстрыми низкоуровневыми событиями, именуемый Человеком. Без наблюдателя все эти события никому не нужны и не интересны, и только человек (пока) умеет копаться в этих пластах, открывать закономерности, удивляться, строить новые уровни и вкладывать новые смыслы.
А так про масштабы вселенной и временных интервалов большинство присутствующих, я уверен, уже не раз размышляли. Про время вычислений - это вообще часть профессии компьютерщика. И все это не сильно уже удивляет, как преподносится в статье.
napa3um
17.09.2021 03:30+2А ведь в «сеттинге» статьи статьи можно бы было попытаться наглядно донести понятие алгоритмической сложности (сколько строителей понадобится для постройки пирамиды высотой 1 километр? а 2?), а не просто удивлять аналогиями :3.
PKav
16.09.2021 12:55+13Осознать насколько быстры компьютеры можно при программировании микроконтроллеров. Там нет ни операционной системы, ни абстракций, ничего. Весь компьютер, каждый его элемент в твоём полном распоряжении. И там частенько приходится мыслить именно тактами, иначе есть риск продолбать момент и не среагировать вовремя на событие, или же потерять синхронизацию и оборвать обмен данными с другим компьютером.
Gordon01
17.09.2021 03:33+4В большинстве случаев операционной системы там нет, потому что "программист" (на самом деле бывший электронщик) просто не осилил -RTOS и в итоге руками, коряво и непереносимо реализовывал то, что есть в -RTOS / сторонней бибилиотеке
PKav
17.09.2021 03:44+1RTOS сейчас и операционной системой-то не назовешь. Она прямая, плоская и открытая, делает всё очень быстро и, как правило, не мешает.
А "непереносимо" может быть связано с высокой оптимизацией под конкретное железо, что может существенно удешевлять массовое производство.
0x131315
17.09.2021 08:36В большинстве случаев оно там тупо не нужно, и лишь сожрёт драгоценные ресурсы.
nixtonixto
17.09.2021 08:38Зачем пихать ОС туда, где она не нужна? Во многих случаях машина состояний гораздо удобней любой ОС, особенно если в системе полно процессов, которые нельзя прерывать, или которые зависят от других процессов, поэтому должна быть жёстко заданная последовательность обработки. В РТОС это решается костылями, но зачем вначале пихать в программу костыль в виде РТОС, а потом подпирать его со всех сторон другими костылями, чтобы оно работало по ТЗ а не по своему разумению?
Gordon01
17.09.2021 17:28+2Зачем пихать ОС туда, где она не нужна?
Во всех случаях, когда исполняется несколько процессов нужна ОС, иначе: "руками, коряво и непереносимо реализовывал то, что есть в -RTOS"
В РТОС это решается костылями
Нет, в РТОС это как раз решается стандартными средствами, собственно это и есть одна из ее главных задач. Увы, большинство "программистов" микроконтроллеров даже это осилить не в состоянии.
anwender95
17.09.2021 07:56А можно bare-metal 4 ядерные армы (апельсинку, например) прогать, если хочется хардкора)
0x131315
17.09.2021 08:45+4Что приятно с контроллерами - все полностью под контролем до такта.
Даже самая дешёвая тинька на 20мгц способна творить чудеса, и реагировать на события в масштабе десятков наносекунд, или записывать их.
Это настоящий временной микроскоп.
SchwarzFuchs
16.09.2021 14:49+4Какая-то у вас допотопная ОЗУ, если обращение к ней занимает 120нс. У самых свежих модулей ~35нс. Даже у меня с моей пожилой DDR3-1600CL9 55нс
babayota_kun Автор
16.09.2021 14:52+8Да, верно, писал как помнил, не загуглив относительно свежие числа. В то время, когда меня интересовал вопрос (и кода я нашёл ответ и запомнил его) memory reference latency была около 100нс.
Внесу правку в статью, спасибо!
PetrEEEfim
16.09.2021 15:07Но если перевести это в "компьютерное" время, то это всего-то час труда раз в пару месяцев.
Работа не бей лежачего, получается
kanvas
16.09.2021 20:08+5Еще и столетия телеметрии…
А запуск Windows, полагаю, с момента строительства Египетских пирамид ещё не завершился. Что эта винда там делает всё это время ??red75prim
17.09.2021 09:00+4У Руссиновича в Windows Internals можно почитать. В 6-й редакции это 13-я глава: 25 страниц описания процесса загрузки. Большую часть времени занимает 38-й шаг второй фазы загрузки - обнаружение и инициализация устройств.
vesper-bot
17.09.2021 11:03Ждет караванов из Нового Света с камнями и папирусом с описаниями привезенного. Каждый раз, когда ей что-то понадобится с диска.
neznaju
16.09.2021 20:23+3Интересно. Самая шокирующая фантазия: мир компьютера детерминирован, а все неопределённости приходят из внешнего мира
garwall
16.09.2021 20:23+19из подобных сравнений
Скот Мюллер. "Модернизация и ремонт ПК"
Вам, возможно, приходилось читать книги или статьи, в которых для описания взаимодействия головки и диска используется аналогия с "Боингом-747", летящим в нескольких метрах над землей со скоростью 800 км/ч. Я сам в течение нескольких лет частенько к ней прибегал на упомянутых семинарах, но никогда не задумывался над тем, насколько точно она соответствует современным накопителям.
Правда, сравнение головки с летящим самолетом всегда казалось мне некорректным. Она ведь никуда не летит, а плавает на воздушной подушке, которая создается на поверхности вращающегося диска.
Правильнее было бы сравнить ее с судном на воздушной подушке. Благодаря специальному профилю головки толщина создающейся воздушной подушки автоматически поддерживается постоянной. Иногда такой способ взаимодействия двух подвижных объектов называют воздушной подвеской.
Пересчитаем теперь все геометрические размеры накопителя в соответствии с масштабом, при котором величина зазора между диском и головкой составит точно 5 мм. Это означает, что все соответствующие числа необходимо умножить на 333 333 — именно во столько раз 5 мм больше, чем 15 нм.
Представьте себе эту головку: при таком увеличении ее длина составит около 410 м, ширина — 325 м, а высота — 100 м (это приблизительно размеры небоскреба Sears, положенного на бок). Перемещается она со скоростью 9 187 км/с на расстоянии всего лишь 5 мм над землей (т. е. над диском) и считывает биты данных, промежутки между которыми равны 2,16 см. Эти биты данных расположены на дорожках, расстояние между которыми составляет всего лишь 29,9 см.
Скорость перемещения этой гипотетической головки даже трудно себе представить, поэтому я приведу конкретный пример. Диаметр Земли составляет 12 742 км, т. е. длина околоземной орбиты, проходящей на расстоянии одного дюйма от поверхности, будет равна приблизительно 40 000 км. Таким образом, развивая скорость 9 187 км/с, эта головка совершит виток вокруг Земли меньше чем за пять секунд.
Не правда ли, хочется воскликнуть: "Видел чудеса техники, но такие!..". И действительно, современный жесткий диск — это настоящее чудо техники! Как видите, пример с авиалайнером оказался лишь жалким подобием того, чт. е. на самом деле (не говоря о его некорректности с точки зрения физики).suguby
16.09.2021 23:10+3Еще была аналогия: представьте что в одном миллиметре - год. Тогда октябрьская революция от на на расстоянии метра. Петр I жил в трех метрах. Христос родился в двадцати метрах. Пирамиды в Египте построили где-то в 50 метрах от нас. Человечество зародилось уже на расстоянии пары километров (200к лет назад). А когда же жили динозавры? 660 километров, Карл! А жизнь зародилась не менее чем в 37 000 км от нас...
Barabas79
17.09.2021 00:04+3представьте что в одном миллиметре — год
Наверное все таки год равен одному сантиметру )
BlackSCORPION
17.09.2021 01:01+2Вспомнился фильм Она (Her), когда ИИ девушка - операционная система, сказала Теодору что одновременно общается ещё с десятком тысяч таких же как он в этот самый момент.
Да, для ИИ люди будут как Бонсаи )
FrytechTV
22.09.2021 02:05Такие вещи обычно принято прятать под спойлер, всё-таки. Понятно, что фильм не новый, но этот момент всё-таки довольно значимый, чтобы просто так его писать.
Viceroyalty
17.09.2021 05:10-5Компьютер ничего не воспринимает и не осознает, статья — просто бесполезный мысленный эксперимент
opetrenko
17.09.2021 09:17как обманчиво быстро летит время: словно вчера начал думать над новой задачей, а как подумаешь, что тогда только-только появились каменные топоры, а об огне и не мечтали....
v1000
17.09.2021 09:35+1И это только процессор. Видеокарты еще быстрее. Интересно сравнить современные и новые модели. Иногда даже не задумываешся, как быстро все стало. В том числе и в плане алгоритмов.
Иногда интересно запустить старую игру, чтобы посмотреть на ее заставку. И понять, что ее рендерели покадрово, а в новой версии этой игры все это рендерится в реальном времени, при этом с большим количеством текстур и деталей.
dMac
17.09.2021 12:56+1Видеокарты не быстрее, они "параллельнее". Одно ядро видеокарты сливает ядру x86 по полной, а "быстрее" получается за счет того, что их там тысячи
alan008
21.09.2021 11:43babayota_kun
Я нашел-таки эту табличку (правда от 2012 года):Latency Comparison Numbers (~2012) ---------------------------------- L1 cache reference 0.5 ns Branch mispredict 5 ns L2 cache reference 7 ns 14x L1 cache Mutex lock/unlock 25 ns Main memory reference 100 ns 20x L2 cache, 200x L1 cache Compress 1K bytes with Zippy 3,000 ns 3 us Send 1K bytes over 1 Gbps network 10,000 ns 10 us Read 4K randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD Read 1 MB sequentially from memory 250,000 ns 250 us Round trip within same datacenter 500,000 ns 500 us Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory Disk seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip Read 1 MB sequentially from disk 20,000,000 ns 20,000 us 20 ms 80x memory, 20X SSD Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 ms Notes ----- 1 ns = 10^-9 seconds 1 us = 10^-6 seconds = 1,000 ns 1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns
Доступна тут:
https://gist.github.com/jboner/2841832
kbtsiberkin
А ведь всё как у людей! Приятно