LINUX.ORG.RU

Нужно понять сколько ресурсов потребляет функция

 , , бенчмарки


0

4

Всем привет!

Есть несколько вариаций алгоритма (не важно какой), нужно каждую вариацию запустить несколько тысяч раз с разными параметрами, чтобы выяснить какой набор лучше экономит память, а какой набор лучше экономит CPU. Все дело замеряется в Rust, но крейт criterion, который обычно в таких случаях берут не умеет трекать память. В остальном этот крейт конечно шикарен. В общем нужно как-то грамотно собрать статистку по продолжительности вызова, потреблению CPU, потреблению памяти. Может, кто-то сталкивался и можно средствами linux организовать, например, через RSS файл? Или как-то valgrind можно натравить именно на функцию, а не в целом на процесс?

В общем, хелп народ

★★★★

Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от Saakx

Хоспади, что ты гиперболизируешь, аллокатор переопределить можно даже без перекомпиляции тупо через LD_PRELOAD, а ещё проще в самом коде, это делается тривиально.

Но есть нюанс :)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Но есть нюанс :)

Какой?

Вообще сейчас буду пробовать, просто rust выделяет память при вызове первой функции, например, 4мб. Я вызываю второй раз с другими параметрами и там уже надо 3мб 800кб и как бы расту не надо ничего выделять и я теряю статистику. Возможно ли через аллокатор перед вторым вызовом освобождать память?

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Вообще сейчас буду пробовать, просто rust выделяет память при вызове первой функции, например, 4мб. Я вызываю второй раз с другими параметрами и там уже надо 3мб 800кб и как бы расту не надо ничего выделять и я теряю статистику

Это ты на RSS смотришь? Это довольно бесполезно. Но вообще говоря ты должен в этом случае каждый вариант своего алгоритма смотреть в отдельном вызове бинарника. И дать ему столько данных чтобы сигнал был выше шума - гигабайт, например.

Возможно ли через аллокатор перед вторым вызовом освобождать память?

Нельзя. И тебе не нужно освобождать память, тебе нужно просто трекать вызовы аллокатора из своего кода. Заведи две глобальные переменные, одну увеличивай в Allocator::allocate и уменьшай в Allocator::deallocate, в другой храни максимум первой. Между измерениями сбрасывай их обе в 0. Таким образом, после вызова своего алгоритма получишь точный пиковый объём запрошенной памяти.

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

И все эти флуктуации будут очень сильно отличаться при использовании другого аллокатора.

А так-то, вообще, объём памяти никто не меряет. Алгоритм тебе известен - по нему ты можешь сказать асимптотику. Константа важна только для случая O(n), и её ты тоже можешь назвать посмотрев на код.

anonymous
()