2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 10, 11, 12, 13, 14
 
 Re: Как писать быстрые программы
Сообщение16.11.2025, 18:57 
Dmitriy40 в сообщении #1709540 писал(а):
Если под распилом Вы подразумеваете разбросать код по функциям, то нет, это замедлит.

Смотря как пилить. Ясно, что "основное вычисление" надо оставить в одной функции, которая работает не вызывая другие [пользовательские] функции как минимум несколько секунд.
Ну и логически разделить, просто в коде.

 
 
 
 Re: Как писать быстрые программы
Сообщение16.11.2025, 19:26 
wrest в сообщении #1709550 писал(а):
Ясно, что "основное вычисление" надо оставить в одной функции, которая работает не вызывая другие [пользовательские] функции как минимум несколько секунд.
Достаточно и доли секунды.
Я недавно измерил скорость проверки кортежа (не совсем кода из этой темы, но достаточно близкого), вышло 20мкс расчётных - в том смысле что столько в среднем занимает одна итерация перебора кортежей, но с учётом хорошей фильтрации реально код проверки занимает порядка 100мкс, просто он вызывается лишь для примерно 1/6 всех итераций, а в остальных случаях отрабатывает намного быстрее. Вызов функции вовсе не бесплатен и займёт доли мкс если не считанные нс (если не передавать огромные массивы), т.е. вполне можно всю проверку конкретного кортежа убрать в функцию. Только я не очень понимаю зачем, ведь ей понадобятся кучи структур и переменных снаружи (пусть и read only, т.е. без побочных эффектов). А уровни вложенности циклов вполне видны при использовании правильных отступов (за что я всех упорно агитирую).

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

В общем, я не вижу смысла бить код с кучей вложенных циклов на функции.
Сделать нормальные отступы, пустые строки между логически завершёнными частями, дописать комменты где что и зачем вычисляется, какие-то переменные переименовать попонятнее - это всё да.
Сделать удобный запуск и перезапуск с точки останова, удобное деление на потоки, на интервалы счёта - это всё тоже да.
Но это всё не про оптимизацию скорости.

 
 
 
 Re: Как писать быстрые программы
Сообщение16.11.2025, 22:48 
Yadryara в сообщении #1709424 писал(а):
так это я у вас хотел спросить. Вы же теперь тестировать начали.

Придумал как объективно померить скорости
Запускал ваш код (который вы прислали через личку) и тот который отправил вам я (с объявлениями типов)
поменял строчку там и там
write(log_name1, potok, " ", nomra, ".");
на
write(log_name1, potok, " ", nomra, ". ",strtime(getwalltime()-t0));
подождал когда появится вторая запись в логе. обоим кодам дал 6 поток.
Ваш код (компилированный).
6 1. 1 ms
6 2. 6min, 25,572 ms

Типизированный код-функция (компилированный)
6 1. 0 ms
6 2. 6min, 15,273 ms


Ну такое :oops: 5%

Кстати о параллельном счёте.

Поскольку я обернул ваш код в функцию ptk(), которая принимает номер "потока", то теперь вы можете запускать например так, в одной сессии gp:
Код:
? parfor(i=7,11,ptk(i))


Я пробовал -- запускается. :!: На экране конечно каша т.к. все пятеро печатают на экран вперемежку.
Но! Монитор загрузки процессора показывает, что на 100% загружены 5 ядер (ессно, это 5 гипертрейдинговых ядер, не настоящих, т.к. настоящих 4). А вот памяти на пятерых ушло где-то 50Мбайт, вместо по 25 на каждого если запускать 5 штук gp в разных сессиях.
https://iimg.su/i/JSBpDC (это для Yadryara т.к. у него проблемы с картинками вставленными в форум).
Это дополнительно иллюстрирует почему независимые от глобальных переменных функции могут пригодиться :wink:
Но вот что будет если один из экземпляров ptk() переполнит стек не знаю -- наверное остановятся все пять.

 
 
 
 Re: Как писать быстрые программы
Сообщение17.11.2025, 00:09 
Dmitriy40
Я тут вспомнил вот что. Наблюдая за нагрузкой ноутбучного процессора в вендовом task manager (не применительно к pari/gp а вообще) я заметил, что когда нагрузка увеличивается и начинает растекаться по нескольким ядрам, частота падает.
Я полагаю, что так ограничивается тепловыделение, чтобы не перегревалось и держалось в примерно заявленных 15Вт TDP.
Так что общая (многопоточная) производительность под многопоточной нагрузкой начинает расти, но каждого ядра - падать. Троттлится, в общем.
Кстати при работе от батареи ещё хуже с производительностью (на моём ноуте), душится нещадно чтобы батарея хоть как-то продержалась.

Возможно, в настольных системах с настольными же процессорами это не так, т.к. там TDP 100-ваттные и больше, огромные кулеры и вот это всё.

 
 
 [ Сообщений: 199 ]  На страницу Пред.  1 ... 10, 11, 12, 13, 14


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group