Числа, которые должен знать каждый программист

Original author: Jeffrey Dean
  • Translation
Чтобы было понятно, на чём следует концентрироваться при оптимизации, слайд из доклада «Создание программных систем в Google и его уроки»:

Обращение к кэшу L1 0.5 нс
Ошибка при предсказании условного перехода 5 нс
Обращение к кэшу L2 7 нс
Открытие/закрытие мьютекса 25 нс
Обращение к главной памяти 100 нс
Сжатие 1 Кб быстрым алгоритмом 3,000 нс
Пересылка 2Кб по сети со скоростью 1 Гб/с 20,000 нс
Чтение 1 Мб последовательно из главной памяти 250,000 нс
Передача сообщения туда/обратно в одном дата-центре 500,000 нс
Произвольный доступ к жёсткому диску 10,000,000 нс
Чтение 1 Мб последовательно с жёсткого диска 20,000,000 нс
Передача пакета из Калифорнии в Нидерланды и обратно 150,000,000 нс

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 120

    +7
    идеальная модель, не более того. в реальности все обычно дольше.
      +11
      Модель для того и существует, чтобы дать приблизительное, максимально близкое, описание чего-либо. Эти данные необходимы когда уже проведена полная оптимизация алгоритмов в Вашей программе. А цифры помнить точно не нужно. Важно понимать, что чтение с диска — это медленно, а передача по сети — еще медленнее и т. д.
        0
        >> Важно понимать, что чтение с диска — это медленно, а передача по сети — еще медленнее и т. д.
        Пересылка 2Кб по сети со скоростью 1 Гб/с 20,000 нс
        Произвольный доступ к жёсткому диску 10,000,000 нс
          +1
          Скорость передачи по сети зависит от множества факторов, скорость чтения с винчестера таких факторов имеет гораздо меньше. Об этом говорит последняя строка в таблице. «Пересылка 2Кб по сети со скоростью 1 Гб/с 20,000 нс» — скорее всего идеальный вариант без маршрутизации и промежуточных машин на каком-нибудь стенде.
            +3
            Да, тут речь, конечно, о непосредственно связанных машинах. Но с маршрутизацией и с промежуточными машинами без выхода в Интернет получается что-то ближе к «Передача сообщения туда/обратно в одном дата-центре: 500,000 нс». Всё равно на порядки быстрее чтения с жёсткого диска.
              0
              это если учитываь что тот сервер который данные отсылает, сам не работает с диском. Иначе будет скорость доступа к диску + скорость доступа по сети. )
                +1
                странная у вас математика, чтобы данные передать, их нужно откуда-то получить и нужно это время приплюсовать.
                опять же файловая система обладает кэшем и считывание может проходить со скоростью сравнимой со скоростью примерно как с оперативки.
                цифры хорошие, только всегда нужно сделовать правилу — доверяй, но проверяй.
              0
              Что-то мне подсказывает что редко бывает гигабитная сеть
                0
                Что-то мне подсказывает, что я сейчас возьму инструмент и пойду ее прокладывать.
                  0
                  У меня провайдер тоже обещает до 100 мб, а правительство обещает хорошую жизнь, а кредиторы обещают хорошие проценты… Я думаю Вы меня поняли =)
                    0
                    >У меня провайдер тоже обещает до 100 мб
                    Он хоть раз обманул и предоставил скорость >100 Мб? Если нет, то к чему претензии?
                    А гигабитная сеть вполне нормальна, другое дело что не каждый жёсткий диск (+ФС) могут отдавать данные с такой скоростью.
                      0
                      Не преувеличивайте, я имел ввиду что пиковые цифры в большинстве случаев теоретические, не более
          +30
          не думаю что каждый программист знает скорость передачи пакета из Калифорнии в Нидерланды и обратно :)
            +36
            Да ты что? Это же основной вопрос на собеседовании. Если погромизд не знает ответа, сразу вон.
              +22
              На старое место, сжимать килобайты быстрым алгоритмом.
                +9
                Или мьютексы открывать и закрывать.
                  +1
                  И опять обратно эти ядра ОС писать…
                  Или к кешу обращаться там…
                  –3
                  7zip-ом
                +4
                да еще не всякий пакет пройдет обратно
                  +29
                  не каждый пакет долетит до середины днепра.
                    +4
                    Вдоль ))
                    +3
                    Пердлагаю добавить в таблицу пункт «передача пакета в интернет и обратно при условии, что пакет потерялся», и устроить дефейс этой странички
                  • UFO just landed and posted this here
                      0
                      Да ну, думаю процентов 60 людей знают что пинг до США — ~100мс )
                      Чертовы подводные кабели :-)
                      +16
                      А я думал что каждый программист должен знать что 00000010 это 2 и т.д.
                        0
                        Любимое число 101(5) :)
                        • UFO just landed and posted this here
                            +2
                            11,10110001000(π) :)
                              +2
                              11,00100100001111110110
                                +1
                                возникло подозрение, что это хотело быть число пи, но хабр решил, что юмор слишком натянутый… я бы плюсанул, если бы мог, но не судьба :)
                                +1
                                100500
                                  +2
                                  самое любимое число должно быть 101010 — которое есть ни что иное, как 42 = «Ответ на главный вопрос жизни, вселенной и всего такого». Все остальные числа — от лукавого
                                    0
                                    Давно хотел спросить что это за 42? Чем оно лучше более красивого 170? Или вы просто отсылаете на любимый роман Дугласа Адамса?
                                      0
                                      тут мне кэп посказал — именно этим и отличается 42 от 170 — упоминанием в автостопом по галактике :) в бинарном виде они одинаково неинтересны
                                +2
                                вообще если это в коде си-подобного языка записать, то скорее всего 8 получится ;)
                                –24
                                Как не странно я даже половину этих цыфр не знал.
                                  +103
                                  И русского.
                                    –9
                                    буквоеды
                                    +1
                                    никто не знает эти цифры так, как не знаете их вы
                                    +4
                                    > каждый программист
                                    явно не веб-программист, ему это, по-моему, нафиг не упёрлось.
                                      –11
                                      В CS нет такой специальности как веб-программист. Умение писать говнокод на php не делает человека программистом.
                                        +37
                                        А умение писать говнокод на C++ — делает?
                                          +1
                                          Нет. Специальности «C++ программист» тоже нет.
                                            –2
                                            И умение компилятора генерировать говнокод тож делает?
                                            +7
                                            Тут нет даже намёка на CS. Зайдите хотя бы на википедию, программист это не обязательно учёный в CS.

                                            И насчёт «говнокода в php» — это жуткий стереотип, в наше время полно хороших и качественных продуктов, нацеленных на web и выполненных на php.
                                            +11
                                            Хоть люди и минусуют этот комментарий, но я соглашусь. Зачем программисту на PHP знать скорость обращения к кэшу L1? Он им не может воспользоваться, ибо даже простой $a=1; это десятки(может сотни и тысячи) операций «под капотом». Уверен, что даже «открытие мютекса» в PHP это далеко не один десяток операций (ибо все равно PHP нужно резолвить $mutex_id — это ж не просто указатель на память, а название переменной).

                                            Далее, «Передача сообщения туда/обратно в одном дата-центре» — это мне кажется, сильно зависит от организации дата-центра. Какого размера сообщение, как соединены стойки, какое оборудование на пути, какова загруженность каналов, какая скорость сети?

                                            И что вообще такое «обращение к главной памяти»? Это так RAM нынче называется?

                                            Собственно эти цифры все вообще абсурдны при PHP программировании, запустите простой скрипт, который 100млн раз в цикле сделает примерно следующее: $b=$a; где $a будет либо пустой, либо равной 1МБ строке (по идее — это «чтение 1МБ из памяти» и замерьте ((microtime(1)-$start_microtime)/$number_of_loops) среднюю скорость выполнения.

                                            Результаты у меня (nginx/php-fpm):

                                            "$b=$a", при $a длиной 0 байт = 85ns;
                                            "$b=$a", при $a длиной 1 МБ (str_repeat(«x», 1024*1024)) = 79ns.

                                            Проверял несколько раз — да, чтение 1МБ из памяти быстрее происходит, чем чтение нуля байт!

                                            Собственно, почему так происходит я точно не знаю, но вывод один — среда выполнения PHP делает слишком много операций (и, возможно, внутренних оптимизаций), чтобы заниматься там какими-то предсказаниями по поводу операций чтения из кэша L1.

                                            Первые цифры полезны программистам на C (даже уже на Java думаю они менее полезны ибо там все же на виртуальной машине происходит выполнение).

                                            Большая часть остальных цифр полезна программистам, которые разрабатывают приложения, работающие более чем на 3 физических серверах (а это менее 1% программистов на PHP, я так предполагаю).

                                            99% программистов на PHP ради интереса можно знать, что:
                                            1. чтение с диска примерно в 100 раз медленней, чем чтение из памяти;
                                            2. даже простой mysql_query('SELECT 1') примерно в 1000 медленней, чем обращение к хэшу $array['item'].

                                            Почему ради интереса? Да потому что большей частью все равно самые сильные оптимизации в PHP — это правильно расставленные индексы в базе данных и кэширование в memcached. А те, кто создавали mySQL/memcached знали как правильно использовать L1, L2 и т.п. От того, что PHP программист будет это знать — его соединение с mysql/memcached не ускорится. А по сути mySQL(и аналоги) — это то, что нужно 99% PHP программистов.

                                            Статью бы надо переименовать в «Числа, которые должен знать каждый программист, работающий на близком к системному уровне»
                                              +18
                                              Имхо, цифры кагбэ говорят, что нефига заниматься оптимизацией обращения к кешам L1/L2, пока есть передача несжатых данных по сети, только и всего.
                                                +1
                                                Чисто ради интересна — и как же это на PHP можно оптимизировать кэш L1/L2?
                                                  +1
                                                  пардон, «интереса»
                                                    +3
                                                    Не напрямую. Например, знание подобных цифр помогут в нужный момент понять (а лучше заранее), что увеличение количества серверов, например, вдвое не увеличит скорость работы проекта в два раза.
                                                    Выше там уже правильно написали — нет понятия «PHP-программист». Либо ты хороший программист, либо нет. А проект создается с использованием оптимальных для него технологий, в том числе учитывая стоимость разработки на них.
                                                      +1
                                                      Ээ, а причем тут php? я думаю тут речь идет о более низкоуровневой разработке.
                                                        0
                                                        Хорошо. Нечего заниматься сжатием передаваемых по сети данных, пока присутствует некешированное чтение с жесткого диска. Это на PHP можно оптимизировать?
                                                        +5
                                                        Цифры говорят, что нефига заниматься оптимизацией, пока профайлер не запустил.
                                                        +12
                                                        Сорву, наверное, покровы, но во всех современных языках начиная с С++ инструкция $b = $a для строк копирует только указатель на строку, а не саму строку.
                                                        Чтобы вызвать копирование строки, добавьте в тест команду $b[0]=«a» или что-то вроде.
                                                          +1
                                                          А вот для C++ это нельзя сказать точно.
                                                            –1
                                                            Нельзя, но почти все стандартные реализации std:string используют «ленивое» копирование.
                                                            +3
                                                            $b = "$a", конечно, в корне меняет дело.

                                                            $b = "$a" (1mb) = 1 024 204 ns
                                                            $b = "$a" (0b) =        160 ns
                                                              +3
                                                              Зачем программисту на PHP знать

                                                              На этом можно было закончить.
                                                              +4
                                                              Конкретно этот пример про php не совсем корректен, посмотрите на тему php copy on write. Т.е. что для строки 0 байтов, что для строки 1 Мб при таком присвоении не происходит копирования (копирование будет при изменении значения переменной, а так — два имени имеют ссылку на одно значение). Полезная штука кстати — передача здоровенных массивов аргументами функции будет стоить примерно столько же, сколько передача инта, если массивы не меняются.
                                                                +1
                                                                это конечно всё правильно вы говорите, но таки а почему бы и нет? в смысле на мой взгляд это гораздо более полезное знание чем знание порядка переменных в вызовах функций mysql_ хотябы потому что не написанно в каждой попавшейся доке
                                                                P.S.
                                                                у меня очень сильное ощущуение что я это где то уже видел на хабре
                                                                  0
                                                                  Эта таблица была месяц-полтора назад в чьих-то комментариях здесь.
                                                                  0
                                                                  > а это менее 1% программистов на PHP
                                                                  достаточно много веб-программистов работают над высоконагрузочными проектами, которые имеют в инфраструктуре сотни и тысячи серверов — цифры вполне полезные и отвечают на приличное количество вопросов по оптимизации.
                                                                  +3
                                                                  Нижняя часть таблицы и веб-программисту пригодится.
                                                                  +29
                                                                  Давайте попробую свою версию чисел для программиста:
                                                                  * Время отведённое на проект
                                                                  * Уровень жадности менеджеров
                                                                  * Количество шума и изменений в ТЗ
                                                                  * Время затрачиваемое на метафизическое превращения проекта в казначейские билеты у вас на руках
                                                                  * Дату рождения подруги/жены

                                                                  Остальное — суета. Ну а более серьёзно — время затрачиваемое на обращение к чему либо в железе волнует далеко не каждого программиста. Мало кто вообще может «опуститься» до системщика с верхних уровней прикладников. Я думаю что никому из моих знакомых программистов цифры из вашей таблицы никогда в жизни не пригодятся. Если уж прикидывать время то как отношение одного к другому — чтение с жёсткого быстрее чтения с сети в десять раз (ведь тоже зависит от сети и от диска).

                                                                    +2
                                                                    Это правильно. Если вы не пишете код для крылатой ракеты, то такими штуками нечего заморачиваться.
                                                                      0
                                                                      Добавьте количество денег на железо
                                                                        0
                                                                        остался вопрос, что все программисты которым нужны эти цифры в гугле работают?
                                                                        +6
                                                                        А эти цифры не должны зависеть от реализации языка программирования или, скажем, от мощности конкретного компьютера?
                                                                          +4
                                                                          Нет, это ведь константы!
                                                                          +20
                                                                          А как же 42? Просветлённому программисту нужно знать только это число.
                                                                            +4
                                                                            Вам смешно, а меня это число преследует. Жил в 2 квартирах с таким номером. Теперь живу в 42-ом доме -_-
                                                                              +2
                                                                              У меня девченки знакомой, это число(номер билета) на экзамене в школу попалась, в колеедже во вступительном, и в отпускном в колледже. Ана мне с такими эмоциями все это рассказывала. Сам кстати тоже жил в доме № 42.
                                                                              Но вот не знал что это какое-то особое число, да слабенький я еще программист.
                                                                                –1
                                                                                и с русским тоже слабовато.
                                                                                  +2
                                                                                  Это уже не смешно…
                                                                              +6
                                                                              Открытие/закрытие мьютекса 25 нс
                                                                              Обращение к главной памяти 100 нс

                                                                              тут всё правильно?
                                                                                +1
                                                                                Cache?
                                                                                  0
                                                                                  как можно закешировать изменение состояния?
                                                                                    0
                                                                                    Как и все другие переменные, которые хранятся в кеше.
                                                                                      0
                                                                                      хм, а смысл, если при каждом успешном открытии/закрытии, которых должно быть большинство, значение меняется?
                                                                                        +1
                                                                                        Чтобы к ОЗУ не обращаться. ru.wikipedia.org/wiki/кеш
                                                                                          0
                                                                                          ну-ну, если запись немедленная, то обращение к ОЗУ будет.
                                                                                          А если отложенная и L2 разделен для ядер, то будет весело когда процессы на разных ядрах один семафор запросят :)
                                                                                  0
                                                                                  Ну если на момент начала операции вы уже в ринг0, то может быть
                                                                                    0
                                                                                    Вы о чем? Очевидно, что под временем операции имелось в виду lock/unlock свободного мьютекса, иначе бы пришлось учитывать время на которое он заблокирован. Либо имеется в виду неблокирующая попытка взять мьютекс. Все это можно реализовать, и обычно и реализуется, операцией compare_and_swap которая выполняется в пространстве пользователя. О каком ring0 Вы говорите?
                                                                                      0
                                                                                      Кажется мы с вами в совершенно разных контекстах.
                                                                                      Мой мютекс виндовый, и он медленный. Что такое ваш мютекс?
                                                                                        0
                                                                                        Вы действтительно думаете, что Google в «Large Distributed Systems» использует «мютекс виндовый»?
                                                                                          0
                                                                                          Я не думал над тем откуда автор оригинала (и понятия не имел), я просто читал текст. А вы что-то начинаете отвечать вопросом на вопрос и проявлять агрессию.
                                                                                          Это не конструктивно, футакимбыть
                                                                                            0
                                                                                            «слайд из доклада «Создание программных систем в Google и его уроки»» — из первой и единственной строчки данной статьи.
                                                                                              0
                                                                                              Как с горохом об стену…

                                                                                              Да, я был невнимателен, и поэтому выступил невкассу
                                                                                0
                                                                                Как же хорошо, что у программистов гугла нет доступа к моему L1 cache.
                                                                                • UFO just landed and posted this here
                                                                                  +44
                                                                                  Хороший программист должен знать намного меньше цифр. Вот они:

                                                                                  — питаться нужно по крайней мере 3 раза в день
                                                                                  — спать нужно как минимум 6 часов в сутки

                                                                                  Все остальное приложится =)
                                                                                    +7
                                                                                    Ерунда, для этого есть офис-манагеры. Они должны в нужных местах выкладывать еду, а также через какое-то время после прихода программиста на работу, например через 15 часов, выгонять его домой спать. Не надо, понимаешь, занятых людей грузить всякими приземленными пошлостями.
                                                                                      0
                                                                                      А кто при этом подложит еду манагеру и выгонит его домой?
                                                                                        +5
                                                                                        Сударь, вы балбес =) Офис манагеры как правило, тетьки, значит, они могут быть блондинками, страдать хроническим пмс и еще всякой фигней… Т.о., прогер может сдохнуть от голода и недосыпа. Если вещи, которые ни кому нельзя доверять =)
                                                                                          0
                                                                                          Где найти таких? Дайте 2 :)
                                                                                          0
                                                                                          И еще 2012. Т.к. будет большой праздник православных программистов: 1024 года со дня крещения Руси :)
                                                                                            0
                                                                                            Я только недавно до этого дошел.
                                                                                            +3
                                                                                            степени двойки? остальное не надо.
                                                                                              +1
                                                                                              я как-то пожалел о том, что не знал числа Каталана
                                                                                              ru.wikipedia.org/wiki/Числа_Каталана
                                                                                              • UFO just landed and posted this here
                                                                                                  +1
                                                                                                  Их не надо знать, их надо уметь считать :)
                                                                                              +23
                                                                                              Где-то видел более запоминающийся вариант. Типа, достать из кэша — равнозначно взять булочку со стола перед собой. Взять из памяти — сходить за булочкой в соседнюю комнату. Взять с диска — спуститься на первый этаж, перейти улицу, купить в магазине, и вернуться обратно…

                                                                                              Не смог найти первоисточник, к сожалению.
                                                                                                0
                                                                                                имхо, немного не так:
                                                                                                взять с диска — спуститься на этаж ниже\подняться на этаж выше к соседу, и у него взять
                                                                                                а скачать по сети — это уже выйти из дома и сходить куда-то :)
                                                                                                +1
                                                                                                мьютекс?
                                                                                                  +1
                                                                                                  Я? Нет, я не мьютекс.
                                                                                                    +1
                                                                                                    А отозвался.
                                                                                                      +1
                                                                                                      Атака подменой адреса? :)
                                                                                                        +3
                                                                                                        Не, просто выскочка.
                                                                                                  –4
                                                                                                  >>должен знать каждый программист
                                                                                                  Программист может знать, программист может и не знать…
                                                                                                  Но программист точно никому ничего не должен.
                                                                                                    +5
                                                                                                    Прочитав заголовок стал ожидать рассказ о 0x5f3759df и иже с ним. А оно вон как.
                                                                                                      0
                                                                                                      А что еще из таких магических констант есть?
                                                                                                        0
                                                                                                        0xDEADBEEF
                                                                                                      0
                                                                                                      Сейчас, когда хабралюди полезли проверять время передачи пакета, то это число стало уже совсем другим
                                                                                                        0
                                                                                                        я вот блин недавно забыл чуть ли не самую главную цифру, которую должен знать программист… размер своей зарплаты
                                                                                                          0
                                                                                                          хорошая у вас зарплата, если вы позволяете себе её забыть ))
                                                                                                          0
                                                                                                          %username% должен знать и уметь VTune, но если не судьба — то да, эту шпаргалку
                                                                                                          • UFO just landed and posted this here
                                                                                                              0
                                                                                                              Передача пакета из Москвы в Нидерланды и обратно Почтой РоссииException in thread "main" java.lang.ArithmeticException: integer overflow

                                                                                                              Only users with full accounts can post comments. Log in, please.