LINUX.ORG.RU

История изменений

Исправление shdown, (текущая версия) :

А я вот всё-таки прокомментирую.

Деньги на любое железо там есть и крайне критична точность и скорость ответа, которую подобны тебе выдувают в дуду, многократно перепроверяя malloc на NULL, и усирая кеш «если таки NULL то вот простынка кода».

Во-первых, оверхед от самого malloc не может сравниться с проверкой на NULL ни в коем случае. Как минимум malloс должен залочить арену, а для этого нужно взять futex, потом его отпустить (это уже две атомарных операции). А ещё обойти свои структуры данных, что часто, как раз-таки, плохо по кэшу. А в худшем случае он сделает системный вызов.

Во-вторых, эти проверки будут хорошо предсказываться branch predictor’ом. Если используется C++, то, скорее всего, там вообще бросается исключение и malloc на NULL проверяется только один раз. А код для случая «вылетело исключение» компилятор как раз помещает в самую жопу.

Почти наверняка у вас в коде-гайде ещё забито «обнулять память после malloc», потому-что это обязательное следствие «всегда проверять malloc и откатывать при NULL».

И почему же это «обязательное следствие»? Типа, убедиться, что ядро эти страницы виртуальной памяти связало с физическими? Наркоман штоле?

Исходная версия shdown, :

А я вот всё-таки прокомментирую.

Деньги на любое железо там есть и крайне критична точность и скорость ответа, которую подобны тебе выдувают в дуду, многократно перепроверяя malloc на NULL, и усирая кеш «если таки NULL то вот простынка кода».

Во-первых, оверхед от самого malloc не может сравниться с проверкой на NULL ни в коем случае. Как минимум malloс должен залочить арену, а для этого нужно взять futex, потом его отпустить (это уже две атомарных операции). А ещё обойти свои структуры данных, что часто, как раз-таки, плохо по кэшу. А в худшем случае он сделает системный вызов.

Кроме того, эти проверки будут хорошо предсказываться branch predictor’ом. Если используется C++, то, скорее всего, там вообще бросается исключение и malloc на NULL проверяется только один раз.

Почти наверняка у вас в коде-гайде ещё забито «обнулять память после malloc», потому-что это обязательное следствие «всегда проверять malloc и откатывать при NULL».

И почему же это «обязательное следствие»? Типа, убедиться, что ядро эти страницы виртуальной памяти связало с физическими? Наркоман штоле?