Pull to refresh

Comments 22

В растовом коде я вижу деление одной и той же переменной в цикле. Это убивает производительность (для этой операции) примерно в 5 раз. Деление (или взятие остатка от деления) в конвейре занимает 2 тика, деление для зависимого значения (т.е. деление результата предыдущего деления) занимает 20+ тиков.

Возможно, все конвертации можно заменить на lookup-таблицы (т.е. month_str = month_lookup[month])

А можете поделиться ссылкой или подробностями, почему так?

Я это для себя обнаруживал, отлаживая tight loop в графическом коде (где надо быстро-быстро считать точки, хотя бы 60 кадров в секунду).

С ходу нашёл вот это: https://www.geeksforgeeks.org/computer-organization-and-architecture-pipelining-set-2-dependencies-and-data-hazard/

А сами цифры вот: https://www.agner.org/optimize/instruction_tables.pdf

Для IDIV там IDIV r64/m64 2 9-17 7-12 (2 тика в pipeline, 7-12 если сделать для data dependency)

UFO just landed and posted this here

Спасибо за идею и ссылки. Обязательно попробую!

Есть подозрение, что можно обойтись ссылками на слайсы конечного массива, а не аллоцировать отдельные массивы. Плюс +48 сделать в конце всего, дабы не захламлять код.

Результаты профайлинга (cprofile):

прокомментируйте пожалуйста, где на этом выводе cProfile видны тормоза преобразования в Json ? (не сарказм, серьезно)

Очень странная подсветка в блоках кода на Rust. Буквально 2-3 слова подсвечивает, остальное серое. Это у меня баг или автор выставил не Rust в качестве языка для них?

fn не подсвечен, from подсвечен (причём не на keyword позиции). if/else подсвечен. Очевидно же, что питон-разметка.

Я слишком редко вижу питон, чтобы это распознать с первого взгляда)

Ну тогда это просто лень/невнимательность/пофигизм автора

Спасибо за то, что подметили! Исправлено.

UFO just landed and posted this here

Хм, впервые услышал. Спасибо за совет! Попробую.

UFO just landed and posted this here

По поводу сериализации даты на Rust:

  1. Массив лучше всего сразу заводить динамический: `vec![0; 30]`. Затем поглащать его через String::from_utf8_unchecked. Во-первых, не породим лишнюю копию данных, во-вторых, избежим ненужных проверок.

  2. HashMap лучше сразу создать с HashMap::with_capacity(1);

  3. Лишние переменные: month_array, day_array и другие.

  4. Про деление уже выше сказали

Отличные советы! Спасибо! Есть еще много места для улучшения...

Почти всё ещё забавно наблюдать как разработчики сначала пишут проект на лайтовых скриптиках (Python, Node.js), а потом героически поднимают производительность ныряя в нормальные компилируемые языки (обычно сразу в C/C++/Rust).
Каждый раз интересно, что мешает сразу писать на чём-то более производительном, хотя бы на Java/.Net.

А мне так же забавно наблюдать как разработчики сначала берут Java/.Net, тратят буквально недели на обсуждения очередного интерфейса или абстрактного класса, чтобы достичь необходимой гибкости архитектуры. И в конечном итоге всё равно из-за нехватки производительности изучают твики виртуальной машины, изобретают всякие костыли для ручного управления памятью и прочее.

Пренебрежительное отношение к скриптовым языкам может быть разве что от незнания бытовой мудрости — какой бы язык не выбрал, всё равно найдутся функциональные блоки, которые будет выгоднее переписать на другом языке.

Я ж не спорю, что, например, для прототипирования или для однократных задач скриптовые языки лучше. Но такое ощущение, что все команды думают: «Ну уж этот проект точно никогда не будет обрабатывать много данных, поэтому быстро напишем на том, на чём можем быстро написать». Только вот далеко не всегда такая быстрая разработка выливается в простую поддержку, оказывается, что иногда приходится переписывать на чём-то быстро работающем, то есть выполнять двойную разработку.
Тут виноваты скорее даже не сами разработчики, а аналитики, которые не смогли заранее, до начала разработки, предсказать нагрузку на продукт/модуль.

Если на проекте неделя тратится на обсуждение интерфейса или абстрактного класса — виноват точно не язык. Просто попались такие разработчики, которым больше нравится обсуждать интерфейсы чем работать.


И да, ваш комментарий выглядит так, как будто разработчики на скриптовых языках не обсуждают неделями абстрактные классы — а это не так. Я даже сталкивался с такими коллегами на проекте...

Потому что это быстрее. На питоне скорость разработки в разы быстрее, чем на "нормальных компилируемых языках". А оптимизация потом может и не потребоваться вовсе. А может и потребоваться, но без применений другого языка, например, с помощью специальных библиотек. Ну а если уже совсем ничего не помогает, тогда только вспоминаем про C и Rust. В итоге конечный результат достигается быстрее, и намного.
(Ничего не имею против "нормальных компилируемых языков", я их тоже очень люблю :))

Сарказм? Прежде чем понять, что появились(возникли) проблемы в производительности в том или ином конкретном месте, проект должен уже работать хотя бы как внутренний MVP. Очевидно, что на C и так далее, вы более или менее сложный проект - будете только дописывать, когда "клиенты" уже будут пользоваться проектом, а автор только лишь тюнить узкие места.

Sign up to leave a comment.