Как стать автором
Обновить

std fs в Rust медленнее, чем Python? Нет, это аппаратный баг

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров10K
Всего голосов 75: ↑75 и ↓0+75
Комментарии9

Комментарии 9

У Python есть какая-то магия?

И не одна.
Лет X назад писал то, что потом было обнаружено как rpmreaper/deborphan - выявление пакетов-leaves. Макет на питоне, "прод" на C.

Внезапно код на C оказался в разы медленнее (понятно, что спец-средств не применялось, stdlib only).

Трассировка показала, что поиск в строках в питоне значительно быстрее, а перераспределение памяти в разы быстрее. Это если не выпендриваться.

Как так - не знаю, но fuckт имел место быть.

ucode это микрокод. Первая буква мю, а не у

Я сталкивался с подобной магией, когда экспериментировал с Cython. На самом деле, если глубоко не вникать в код, память и т.д., то очень часто переписать на C это хуже. Не поймите неправильно, сам по себе C быстрее Python. Проблема в разработчиках и накладных расходах на разработку.

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

Но у нас как обычно: "давайте перепишем на язык X и сразу ускоримся в N раз!" Кекас два. Потом запускаются в облаке, на каком-то старом Linux ядре 4.4, дешёвых энергоэффективных процессорах и скорость просто пополам ниже.

Недавно столкнулся с похожей ситуацией. Есть очень простой тест скорости доступа до эндпойнта на Ruby: 5000 раз сделать REST-запрос и распарсить полученный JSON. Из любопытства переписал тест на C++, и вопреки ожиданиям среднее время доступа увеличилось процентов на 5. Проверял на домашнем десктопе (Ryzen 5) и облачных виртуалках. Пробовал разные библиотеки для работы с JSON в C++, но замедление сохранялось. В причинах разбираться не стал, поскольку не обладаю необходимой квалификацией.

То есть, плохой код на с++, медленнее хорошо на руби?..

Скорее «библиотека в плюсах оказалась медленнее библиотеки в руби»

Причём библиотека в руби тоже написана не на руби, а на чём-то типа плюсов.

А вот кстати говоря:

Benchmark 1: python-fs-read/test.py
Time (mean ± σ): 15.9 ms ± 0.7 ms [User: 5.6 ms, System: 10.1 ms]
Benchmark 2: python-opendal-read/test.py
Time (mean ± σ): 32.9 ms ± 1.3 ms [User: 6.1 ms, System: 26.6 ms]

Нельзя ли было какой-то вывод сделать уже на этом этапе?

Это просто великолепно. Читаешь как некий детектив, при этом финал неожиданный. Спасибо большое за эту статью.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории