Модель для того и существует, чтобы дать приблизительное, максимально близкое, описание чего-либо. Эти данные необходимы когда уже проведена полная оптимизация алгоритмов в Вашей программе. А цифры помнить точно не нужно. Важно понимать, что чтение с диска — это медленно, а передача по сети — еще медленнее и т. д.
>> Важно понимать, что чтение с диска — это медленно, а передача по сети — еще медленнее и т. д.
Пересылка 2Кб по сети со скоростью 1 Гб/с 20,000 нс
Произвольный доступ к жёсткому диску 10,000,000 нс
Скорость передачи по сети зависит от множества факторов, скорость чтения с винчестера таких факторов имеет гораздо меньше. Об этом говорит последняя строка в таблице. «Пересылка 2Кб по сети со скоростью 1 Гб/с 20,000 нс» — скорее всего идеальный вариант без маршрутизации и промежуточных машин на каком-нибудь стенде.
Да, тут речь, конечно, о непосредственно связанных машинах. Но с маршрутизацией и с промежуточными машинами без выхода в Интернет получается что-то ближе к «Передача сообщения туда/обратно в одном дата-центре: 500,000 нс». Всё равно на порядки быстрее чтения с жёсткого диска.
странная у вас математика, чтобы данные передать, их нужно откуда-то получить и нужно это время приплюсовать.
опять же файловая система обладает кэшем и считывание может проходить со скоростью сравнимой со скоростью примерно как с оперативки.
цифры хорошие, только всегда нужно сделовать правилу — доверяй, но проверяй.
>У меня провайдер тоже обещает до 100 мб
Он хоть раз обманул и предоставил скорость >100 Мб? Если нет, то к чему претензии?
А гигабитная сеть вполне нормальна, другое дело что не каждый жёсткий диск (+ФС) могут отдавать данные с такой скоростью.
самое любимое число должно быть 101010 — которое есть ни что иное, как 42 = «Ответ на главный вопрос жизни, вселенной и всего такого». Все остальные числа — от лукавого
Хоть люди и минусуют этот комментарий, но я соглашусь. Зачем программисту на 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 программистов.
Статью бы надо переименовать в «Числа, которые должен знать каждый программист, работающий на близком к системному уровне»
Не напрямую. Например, знание подобных цифр помогут в нужный момент понять (а лучше заранее), что увеличение количества серверов, например, вдвое не увеличит скорость работы проекта в два раза.
Выше там уже правильно написали — нет понятия «PHP-программист». Либо ты хороший программист, либо нет. А проект создается с использованием оптимальных для него технологий, в том числе учитывая стоимость разработки на них.
Хорошо. Нечего заниматься сжатием передаваемых по сети данных, пока присутствует некешированное чтение с жесткого диска. Это на PHP можно оптимизировать?
Сорву, наверное, покровы, но во всех современных языках начиная с С++ инструкция $b = $a для строк копирует только указатель на строку, а не саму строку.
Чтобы вызвать копирование строки, добавьте в тест команду $b[0]=«a» или что-то вроде.
Конкретно этот пример про php не совсем корректен, посмотрите на тему php copy on write. Т.е. что для строки 0 байтов, что для строки 1 Мб при таком присвоении не происходит копирования (копирование будет при изменении значения переменной, а так — два имени имеют ссылку на одно значение). Полезная штука кстати — передача здоровенных массивов аргументами функции будет стоить примерно столько же, сколько передача инта, если массивы не меняются.
это конечно всё правильно вы говорите, но таки а почему бы и нет? в смысле на мой взгляд это гораздо более полезное знание чем знание порядка переменных в вызовах функций mysql_ хотябы потому что не написанно в каждой попавшейся доке
P.S.
у меня очень сильное ощущуение что я это где то уже видел на хабре
> а это менее 1% программистов на PHP
достаточно много веб-программистов работают над высоконагрузочными проектами, которые имеют в инфраструктуре сотни и тысячи серверов — цифры вполне полезные и отвечают на приличное количество вопросов по оптимизации.
Давайте попробую свою версию чисел для программиста:
* Время отведённое на проект
* Уровень жадности менеджеров
* Количество шума и изменений в ТЗ
* Время затрачиваемое на метафизическое превращения проекта в казначейские билеты у вас на руках
* Дату рождения подруги/жены
Остальное — суета. Ну а более серьёзно — время затрачиваемое на обращение к чему либо в железе волнует далеко не каждого программиста. Мало кто вообще может «опуститься» до системщика с верхних уровней прикладников. Я думаю что никому из моих знакомых программистов цифры из вашей таблицы никогда в жизни не пригодятся. Если уж прикидывать время то как отношение одного к другому — чтение с жёсткого быстрее чтения с сети в десять раз (ведь тоже зависит от сети и от диска).
У меня девченки знакомой, это число(номер билета) на экзамене в школу попалась, в колеедже во вступительном, и в отпускном в колледже. Ана мне с такими эмоциями все это рассказывала. Сам кстати тоже жил в доме № 42.
Но вот не знал что это какое-то особое число, да слабенький я еще программист.
ну-ну, если запись немедленная, то обращение к ОЗУ будет.
А если отложенная и L2 разделен для ядер, то будет весело когда процессы на разных ядрах один семафор запросят :)
Вы о чем? Очевидно, что под временем операции имелось в виду lock/unlock свободного мьютекса, иначе бы пришлось учитывать время на которое он заблокирован. Либо имеется в виду неблокирующая попытка взять мьютекс. Все это можно реализовать, и обычно и реализуется, операцией compare_and_swap которая выполняется в пространстве пользователя. О каком ring0 Вы говорите?
Я не думал над тем откуда автор оригинала (и понятия не имел), я просто читал текст. А вы что-то начинаете отвечать вопросом на вопрос и проявлять агрессию.
Это не конструктивно, футакимбыть
Ерунда, для этого есть офис-манагеры. Они должны в нужных местах выкладывать еду, а также через какое-то время после прихода программиста на работу, например через 15 часов, выгонять его домой спать. Не надо, понимаешь, занятых людей грузить всякими приземленными пошлостями.
Сударь, вы балбес =) Офис манагеры как правило, тетьки, значит, они могут быть блондинками, страдать хроническим пмс и еще всякой фигней… Т.о., прогер может сдохнуть от голода и недосыпа. Если вещи, которые ни кому нельзя доверять =)
Где-то видел более запоминающийся вариант. Типа, достать из кэша — равнозначно взять булочку со стола перед собой. Взять из памяти — сходить за булочкой в соседнюю комнату. Взять с диска — спуститься на первый этаж, перейти улицу, купить в магазине, и вернуться обратно…
имхо, немного не так:
взять с диска — спуститься на этаж ниже\подняться на этаж выше к соседу, и у него взять
а скачать по сети — это уже выйти из дома и сходить куда-то :)
Числа, которые должен знать каждый программист