Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!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
є можливість вказати власний модуль з хуками, які запускатимуться перед прикладом.