Следуя призыву Линуса Торвальдса как можно больше и чаще тестировать ядро Linux, некто Джероен Врикен (Jeroen Vreeken) опубликовал сегодня в LKML прекрасный тест, который имитирует среднестатистическую деятельность Linux-хакера. Соответственно, он показывает производительность ядра для самой важной группы его пользователей - хакеров самого ядра.
Сэмулировать деятельность хакера оказалось довольно просто, сам тест прилагается ниже, компилируйте его с помощью 'gcc -Wall lkh-bm.c -o lkh-bm'.
Сам Джероен протестировал с его помощью ядра всех версий 2.6.x и, выборочно, некотороые из предыдущих веток. К сожалению, лично ему не удалось запустить тест на ядрах версий 1.1 и более ранних. Автор теста планирует ежедневно прогонять на нем все официальные релизы, а также снимки веток bk, mm и ac.
Приводятся и результаты тестирования с использованием компилятора gcc 3.2.3 на машине Celeron 2.4GHz. Как оказалось, что бы не говорили о регрессиях или улучшениях, для настоящих хакеров производительность ядра Linux за последние годы была одинакова. Невыясненным осталось одно - то ли ядро действительно хорошо поддерживается и не ухудшает свои характеристики, то ли хакеры ядра не делают ничего полезного...
Benchmark results:
1.1.0 0
1.1.20 0
1.1.40 0
1.1.60 0
1.2.0 603
2.0.0 604
2.0.10 605
2.0.20 600
2.0.30 601
2.2.0 602
2.2.10 603
2.2.20 604
2.4.0 605
2.4.10 600
2.4.20 601
2.6.0 602
2.6.1 603
2.6.2 604
2.6.3 605
2.6.4 600
2.6.5 601
2.6.6 602
2.6.7 603
2.6.8 604
2.6.9 605
2.6.10 600
2.6.11 601
Исходный код на языке C (lkh-bm.c)
#include <stdio.h>
#include <time.h>
#define MEASUREMENT_TIME 60
#define LINUS_CONSTANT 6
/*
* my_integer_pi()
*
* This function calculates the value of PI, and returns
* 3. It does so by adding "1" in a loop three times.
*/
int my_integer_pi(void)
{
int i, pi;
/*
* This is the main loop.
*/
pi = 0;
for (i = 0; i < 3; i++)
pi++;
/* Ok, return it */
return pi;
}
int main(int argc, char **argv)
{
time_t timer, start, prev;
int completed = 0;
int calc;
start = time(NULL);
timer = start;
prev = start;
while ( timer - start <= MEASUREMENT_TIME ) {
/* do some typical kernel hacker stuff... */
calc = my_integer_pi();
timer = time(NULL);
if ((timer - prev) == LINUS_CONSTANT ) {
completed++;
prev = timer;
}
}
printf("endless LKH loops per hour: %ld\n",
completed * 3600 / MEASUREMENT_TIME + (time(NULL) % LINUS_CONSTANT));
return 0;
}
|