И снова про инструменты разработки. Часто бывает необходимо сравнить производительность/пропускную способность того или иного участка кода, а писать тестирующий код ой как не хочется. А ведь надо всего-то, запустить нужный метод N раз и померять время выполнения.
Вот сегодня у меня возник вопрос. Сколько процессору надо времени, чтобы проитерироваться по массиву с заданной длинной?
Недолго думая, пишем простой POJO класс описывающий тестовый случай.
package com.blogspot.dotsid.ldt;
public class ArrayIterationTest {
private int size;
private int[] data;
public void setSize(int size) {
this.size = size;
}
public void prepare() {
data = new int[size];
}
public void doTest() {
for ( int i : data );
}
}
компилируем исходник и находясь в classpath’е выполняем:
$ ldt -z com.blogspot.dotsid.ArrayIterationTest#doTest -n 100 -p "size=1000000"
RESULTS
--------------------------------------------------
Concurrency level : 1
Samples count (per thread) : 100
Total time : 180ms
Min. time : 1ms
Max. time : 5ms
Throughput : 553 tps
В этом тесте мы создали массив размером 1 миллион позиций и проитерировались по нему 100 раз. Как видно мой процессор по этому массиву пробегает со скоростью несколько миллисекунд на одну полную итерацию.
Довольно простой и эффективный инструмент для выполнения нагрузочных тестов на отдельные модули системы. Основные возможности:
- поддержка многопоточного тестирования;
- поддержка warm up периода (указанное число первых прогонов теста может не участвовать в измерениях. Это бывает необходимо для обеспечения hot code execution path);
- поддержка фикстур (prepare/cleanup);
- sub millisecond accuracy;
- поддержка maven;
Утилита open source и доступна на github. Еще один маленький и незатейливый инструмент, который полезно иметь под рукой. Ведь именно из таких инструментов и формируется окружение которое позволяет нам работать эффективно. Как говорится, “что нельзя измерить, тем нельзя управлять”.