Как вы очищаете кеш, когда мы измеряем производительность функции - PullRequest
2 голосов
/ 30 октября 2010

Кэш ЦП всегда прерывает тестирование производительности некоторых кодов.

gettime();
func1();
gettime();

gettime();
func2();
gettime();
// func2 is faster because of the cache.(or page faults of func1())
// But we often misunderstand.

Когда вы измеряете производительность своего кода, как вы убираете влияние кеша.

Я нахожунекоторые функции или способы сделать это в Windows.
Пожалуйста, дайте мне ваши хорошие советы.Спасибо.

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Одна вещь, которую вы можете сделать, это вызвать функцию, которая имеет много кода и обращается к большому количеству памяти между вызовами к профилируемому элементу.Например, в псевдокоде (который в основном не зависит от языка):

// loop some number of times
{
  //start timing
  profile_func();
  //stop timing
  //add to total time
  large_func(); // Uses lots of memory and has lots of code
}
// Compute time of profile func by dividing number of iterations by total time

Код в large_func () может быть бессмысленным кодом, как некоторый набор операций, повторяемых снова и снова.Ключевым моментом является то, что он или его код не оптимизируются при компиляции, так что он фактически очищает кэш кода и данных ЦП (а также кеш L2 и L3 (если имеется)).

Это очень важный тест для многих случаев.Это важно по той причине, что небольшие быстрые функции, которые часто профилируются изолированно, могут работать очень быстро, используя кэш-память ЦП, встраивание и регистрацию.Но часто в больших приложениях эти преимущества отсутствуют из-за контекста, в котором эти быстрые функции вызываются.

Например, простое профилирование функции путем запуска ее в течение миллиона итераций в узком цикле может показать, что функция выполняется, скажем, за 50 наносекунд.Затем вы запускаете его с помощью инфраструктуры, которую я показал выше, и внезапно его время работы может резко увеличиться до микросекунд, потому что он больше не может использовать тот факт, что у него есть весь процессор - его регистры и кэши, для себя.

0 голосов
/ 30 октября 2010

Хороший код использует преимущества кэша, поэтому вы не можете просто отключить его (можно, но эти результаты будут совершенно неактуальными).

Вам нужно очистить (или сделать недействительным) кэш между последовательными тестами.Вот несколько советов: Недействительная кеш-память процессора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...