Стендап Сьогодні
📢
Канал в Telegram @stendap_sogodni
🦣
@stendap_sogodni@shevtsov.me в Федиверсі
27.02.2023
Поради по бенчмарках на Ruby
Сьогодні вдалося зробити чудовий бенчмарк для моїх поробок на Redshift. Власне, сам бенчмарк робився на Ruby, та порівнював швидкодію різних запитів в базу. Поки писав, знайшов пару цікавих рішень.
-
Обовʼязково треба знати про бібліотеку benchmark-ips. На відміну від стандартного модуля
Benchmark
, ця бібліотека запускає приклади багато разів, та визначає середню швидкодію в ітераціях на секунду (IPS
), а також порівнює її проміж прикладами. Я тільки з цією бібліотекою бенчмарки й роблю. -
Бенчмарк бази ускладнюється тим, що треба підготувати репрезентабельний набір даних, а також уникнути кешування результатів — як повного, так і часткового. Тому вирішив вимірювати на реальних даних, а щоб було чесніше — для кожної ітерації підставляв випадкові параметри фільтрів. Для цього, звісно, є вбудований шаблонізатор ERB. До речі, у класу
ERB
є непомітний методERB#result_with_hash
. Він підставляє у шаблон дані з хешу, а не з об’єкта, що мені майже завжди зручніше. -
Але ж, якщо параметри запитів випадкові, то як можна порівнювати результати проміж варіантами? Можна, якщо генератор випадкових чисел перезаряджати перед прикладом. (Випадкові числа — то є передбачувана послідовність, яка починається з початкового значення — зерна. Знаючи зерно, відтвориш всю послідовність.) Для цього треба створити генератор командою
@rng = Random.new
, а перезаряджати, відповідно, командою@rng = Random.new(@rng.seed)
, щоб зберегти початкове значення. -
До речі, для цього у
benchmark-ips
є можливість вказати власний модуль з хуками, які запускатимуться перед прикладом.