Стоит ли использовать rdts c () для измерения скорости? - PullRequest
0 голосов
/ 05 мая 2020

У меня есть 4 тестовых функции - foo1 (), foo2 (), foo3 () и foo4 (). Для измерений я использую следующую программу:

unsigned __int64 start;
unsigned __int64 stop;
unsigned __int64 sum;
unsigned __int64 orig;

sum = 0;
for (int i = 0; i < 10000; i++)
{
    start = __rdtsc();
    foo1();
    stop = __rdtsc();
    sum += (stop - start);
}
orig=sum;
cout << "foo1() \taverage: " << (sum / 10000.0) << ", \tratio: " << ((double)orig / sum) << endl << endl;

sum = 0;
for (int i = 0; i < 10000; i++)
{
    start = __rdtsc();
    foo2();
    stop = __rdtsc();
    sum += (stop - start);
}
cout << "foo2() \taverage: " << (sum / 10000.0) << ", \tratio: " << ((double)orig / sum) << endl << endl;

И так далее, для foo3 () и foo4 ().

У меня на консоли есть этот журнал:

foo1()      average: 401495,        ratio: 1
foo2()      average: 24251.2,       ratio: 16.5557
foo3()      average: 11497.7,       ratio: 34.9195
foo4()      average: 7439.06,       ratio: 53.9713

Означает ли это, что использование foo4 () в ~ 50 раз быстрее (в реальном времени), чем foo1 ()?

ИЛИ означает ли это, что foo4 () ОПРЕДЕЛЕННО лучше по производительности, чем foo1 ()?

1 Ответ

1 голос
/ 05 мая 2020

« быстрее (в реальном времени) » и « лучше по производительности » эквивалентны в однопоточном неконфликтном контексте при условии, что измерения верны.

Судя по всему, измерение ускорения в 50 раз является верным признаком того, что функция работает быстрее и, следовательно, лучше, чем базовый уровень.

НО перед тем, как сделать вывод:

Оберните свой код в другой внешний l oop и l oop хотя бы на пару сотен миллисекунд, отбрасывая результаты первых 200 мс, затем возьмите среднее из остальные измерения. Это особенно важно, если тестируемые функции обращаются к памяти. Эффекты кэширования памяти могут составлять более 100 раз разницу во времени.

Добавьте вызов _mm_lfence() после каждого вызова foo, чтобы убедиться, что все его инструкции удаляются перед измерением часов.

Микробенчмаркинг сложен; это часто означает, что некоторые функции могут быть осмысленно измерены только в сочетании, а также объем обрабатываемых данных должен быть примерно эквивалентен сценарию из реальной жизни.

...