Add some perf tests

This commit is contained in:
proller 2017-07-17 18:36:27 +03:00 committed by alexey-milovidov
parent 116c889b42
commit bab4b3b042
2 changed files with 142 additions and 0 deletions

View File

@ -0,0 +1,62 @@
<test>
<name>wip</name>
<type>once</type>
<stop_conditions>
<any_of>
<!-- This is only for infinite running query. -->
<average_speed_not_changing_for_ms>10000</average_speed_not_changing_for_ms>
<total_time_ms>1000</total_time_ms>
</any_of>
</stop_conditions>
<metrics>
<!-- For running one inifinite query -->
<max_rows_per_second />
<max_bytes_per_second />
<avg_rows_per_second />
<avg_bytes_per_second />
</metrics>
<!--
9. Генератор случайных чисел.
Функция rand представляет собой linear congruential generator (то есть, целочисленное умножение на константу и сложение с константой), возвращающий 32-битные целые случайные числа.
Она реализована так, чтобы несколько потоков случайных чисел вычислялось независимо, и компилятор мог векторизовать цикл.
Тест, как и многие другие ниже, представлен в виде запроса из таблицы system.numbers. Чтение из этой таблицы осуществляется в один поток, и эта таблица при чтении выдаёт подряд почти все натуральные числа.
То есть, этот запрос представляет собой необычным образом написанный бесконечный цикл.
Мы запускаем этот запрос и наблюдаем, с какой скоростью он выполняется. Через несколько секунд, когда скорость стабилизируется, прерываем выполнение.
В качестве скорости выполнения запроса указывается количество обработанных исходных (прочитанных из таблицы) данных в единицу времени.
Например, в таблице system.numbers читаемые нами данные - это числа типа UInt64 (8 байт). Если мы обрабатываем миллиард таких чисел в секунду, то отобразится скорость - 8 GB/sec.
-->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(rand())</query>
<!-- 10. Некриптографическая хэш-функция для целых чисел 64bit -> 64bit. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(intHash64(number))</query>
<!-- 11. Некриптографическая хэш-функция для целых чисел 64bit -> 32bit. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(intHash32(number))</query>
<!-- 12. Преобразование целого числа в строку в десятичном виде. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(toString(number))</query>
<!-- 13. Преобразование целого числа в строку путём копирования куска памяти. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(reinterpretAsString(number))</query>
<!-- 26. Целочисленное деление на константу. Используется библиотека libdivide. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(number / 7)</query>
<!-- 27. Целочисленное деление на константу. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(number % 7)</query>
<!-- 28. Целочисленное деление на константу. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(number % 34908756)</query>
<!-- 29. Lookup-таблица, помещающаяся в L2-кэш. -->
<query>SELECT number % 1000 AS k, count() FROM system.numbers GROUP BY k</query>
<!-- 30. Хэш-таблица, помещающаяся в L3-кэш. -->
<query>SELECT number % 100000 AS k, count() FROM system.numbers GROUP BY k</query>
<!-- 31. Хэш-таблица, наверное помещающаяся в L3-кэш. -->
<query>SELECT number % 1000000 AS k, count() FROM system.numbers GROUP BY k</query>
<!-- 32. Хэш-таблица, не помещающаяся в L3-кэш. -->
<query>SELECT number % 10000000 AS k, count() FROM system.numbers GROUP BY k</query>
<!-- 33. Хэш-таблица, требующая кучу оперативки. Возможны интересные эффекты. -->
<query>SELECT number % 500000000 AS k, count() FROM system.numbers GROUP BY k</query>
<!-- 35. Кэш-промахи, осуществляемые из многих процессорных ядер. -->
<!-- <query>SELECT number % (intDiv(100000000, {THREADS})) AS k, count() FROM system.numbers_mt GROUP BY k</query> -->
<!-- 46. Запрос, требующий много бесполезных копирований. -->
<query>SELECT count() FROM system.numbers WHERE NOT ignore(materialize('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') AS s, concat(s,s,s,s,s,s,s,s,s,s) AS t, concat(t,t,t,t,t,t,t,t,t,t) AS u) SETTINGS max_block_size = 1000</query>
</test>

View File

@ -0,0 +1,80 @@
<test>
<name>test.hits misc</name>
<type>once</type>
<stop_conditions>
<any_of>
<!-- This is only for infinite running query. -->
<average_speed_not_changing_for_ms>10000</average_speed_not_changing_for_ms>
<total_time_ms>1000</total_time_ms>
</any_of>
</stop_conditions>
<metrics>
<!-- For running one inifinite query -->
<max_rows_per_second />
<max_bytes_per_second />
<avg_rows_per_second />
<avg_bytes_per_second />
</metrics>
<preconditions>
<table_exists>test.hits</table_exists>
</preconditions>
<!--
14. Некриптографическая хэш-функция для строк небольшой длины.
В качестве данных в следующих тестах будут использованы поисковые фразы (SearchPhrase), URL и PageCharset.
Строка SearchPhrase непустая только в 6.8% случаев. Средняя длина непустой строки - 47 байт.
URL почти всегда непуст и его средняя длина - 77 байт.
PageCharset тоже почти всегда непуст, но его средняя длина поменьше - 6.2 байта. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(cityHash64(SearchPhrase)) SETTINGS max_threads = 1</query>
<!-- 15. Некриптографическая хэш-функция для строк небольшой длины. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(farmHash64(SearchPhrase)) SETTINGS max_threads = 1</query>
<!-- 16. Некриптографическая хэш-функция для строк небольшой длины. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(metroHash64(SearchPhrase)) SETTINGS max_threads = 1</query>
<!-- 17. Криптографическая хэш-функция для строк. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(sipHash64(SearchPhrase)) SETTINGS max_threads = 1</query>
<!-- 18. Криптографическая хэш-функция для строк. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(MD5(SearchPhrase)) SETTINGS max_threads = 1</query>
<!-- 19. Криптографическая хэш-функция для строк. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(MD5(URL)) SETTINGS max_threads = 1</query>
<!-- 20. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(cityHash64(URL)) SETTINGS max_threads = 1</query>
<!-- 21. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(sipHash64(URL)) SETTINGS max_threads = 1</query>
<!-- 22. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(cityHash64(PageCharset)) SETTINGS max_threads = 1</query>
<!-- 23. Поиск подстроки в строке. -->
<query>SELECT count() FROM test.hits WHERE URL LIKE '%metrika%' SETTINGS max_threads = 1</query>
<!-- 24. Более сложный поиск подстроки в строке. -->
<query>SELECT count() FROM test.hits WHERE positionCaseInsensitiveUTF8(URL, 'новости') != 0 SETTINGS max_threads = 1</query>
<!-- 25. Регексп. -->
<query>SELECT count() FROM test.hits WHERE match(URL, '^https?://(?:www\\.)?metri[kc]a\\.yandex\\.(?:ru|com|com\\.tr|ua|by|kz)/.+?2014') SETTINGS max_threads = 1</query>
<!-- 34. Сложная агрегация. -->
<query>SELECT SearchEngineID, SearchPhrase, RegionID FROM test.hits GROUP BY SearchEngineID, SearchPhrase, RegionID ORDER BY count() DESC LIMIT 10 SETTINGS max_threads = 1</query>
<!-- 36. Функция для работы с датой и временем. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(toMonday(EventTime)) SETTINGS max_threads = 1</query>
<!-- 37. Функция для работы с URL. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(cutQueryString(URL)) SETTINGS max_threads = 1</query>
<!-- 38. Разные алгоритмы вычисления квантилей. -->
<query>SELECT quantilesIf(0.5, 0.9)(SendTiming, SendTiming > 0) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 39. Разные алгоритмы вычисления квантилей. -->
<query>SELECT quantilesTimingIf(0.5, 0.9)(SendTiming, SendTiming > 0) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 40. Разные алгоритмы вычисления квантилей. -->
<query>SELECT quantilesExactIf(0.5, 0.9)(SendTiming, SendTiming > 0) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 41. Разные алгоритмы вычисления квантилей. -->
<query>SELECT quantilesTDigestIf(0.5, 0.9)(SendTiming, SendTiming > 0) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 42. Разные алгоритмы вычисления кардинальности. -->
<query>SELECT uniq(UserID) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 43. Разные алгоритмы вычисления кардинальности. -->
<query>SELECT uniqCombined(UserID) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 44. Разные алгоритмы вычисления кардинальности. -->
<query>SELECT uniqExact(UserID) FROM test.hits SETTINGS max_threads = 1</query>
<!-- 45. Что-то чуть более похожее на реальный запрос. -->
<query>SELECT RegionID, uniq(UserID) FROM test.hits GROUP BY RegionID SETTINGS max_threads = 1</query>
<!-- 47. Читаем и разжимаем все столбцы, и ничего с ними потом не делаем. -->
<query>SELECT count() FROM test.hits WHERE NOT ignore(*) SETTINGS max_threads = 1</query>
</test>