Как я могу измерить производительность холодного кода? - PullRequest
3 голосов
/ 01 декабря 2011

Предположим, у меня есть два метода, Foo и Bar, которые примерно одинаковы, и я хочу измерить, какой из них быстрее.Кроме того, однократное выполнение Foo и Bar слишком быстрое для надежного измерения.

Обычно я просто запускаю их оба огромное количество раз, например:

var sw=new Stopwatch();
sw.Start();
for(int ii=0;ii<HugeNumber;++ii)
    Foo();
sw.Stop();
Console.WriteLine("Foo: "+sw.ElapsedMilliseconds);
// and the same code for Bar

Но при этом каждый прогон Foo после первого, вероятно, будет работать с кешем процессора, а не с реальной памятью.Что, вероятно, намного быстрее, чем в реальном приложении.Что я могу сделать, чтобы мой метод каждый раз охлаждался?

Разъяснение Под "примерно одинаковыми" я подразумеваю, что оба метода используются одинаково, но фактический алгоритм может существенно отличаться.Например, Foo может выполнять сложную математику, а Bar пропускает ее, используя больше памяти.

И да, я понимаю, что методы, работающие в холодном режиме, не будут иметь много влияет на общую производительность.Мне все еще интересно, какой из них быстрее.

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Прежде всего, если Foo работает с кешем процессора, то Bar также будет работать с кешем процессора.Разве это не должно ????????Таким образом, обе ваши функции получают одинаковое преимущество.Теперь предположим, что после первого времени foo равно A, а затем оно работает со средним временем B, так как оно работает с кешем процессора.Таким образом, общее время будет

A + B*(hugenumber-1)

Аналогично для Bar это будет

C + D*(hugenumber-1) //where C is the first runtime and D is the avg runtime using prscr cache

Если я не ошибаюсь, результат зависит от B и D, и оба они являются средним временем выполненияиспользуя кэш процессора.Поэтому, если вы хотите вычислить, какая из ваших функций лучше, я думаю, что кеш процессора не является проблемой, поскольку обе функции должны использовать это.

Отредактировано:

Я думаю, теперь все ясно.Поскольку Бар пропускает некоторые сложные математические операции, используя память, у него будет небольшое преимущество (может быть в нано / пико секундах).Так что для того, чтобы ограничить это, вы должны очистить ваш кэш процессора внутри цикла for.Поскольку в обоих циклах вы будете делать то же самое, я думаю, теперь вы получите лучшее представление о том, какая функция лучше.Уже есть обсуждение переполнения стека о том, как очистить кэш процессора.Пожалуйста, просмотрите эту ссылку надеюсь, что это поможет.

Редактировать детали: Улучшен ответ и исправлено написание

0 голосов
/ 01 декабря 2011

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

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

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