PostSharp не влияет на скорость - PullRequest
3 голосов
/ 19 января 2010

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

Теперь я не могу измерить разницу на нескольких миллионах прогонов, и сумасшедший прогон ~ 40 миллиардов итераций равнялся разнице всего в несколько наносекунд по сравнению с версией без PostSharp, выполняющей такое же количество вызовов. Для меня это невозможно. Должно быть что-то не так с моим тестом. Мои коллеги пересмотрели код, поэтому я вполне уверен, что код выполняет то, что я намереваюсь.

Итак, есть ли что-то не так с использованием генерации строк (что является ожидаемым использованием в предполагаемых приложениях) в качестве медленной симуляции для тестов?

Или кто-то еще выполнил (или знает) анализ производительности PostSharp во время выполнения?

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 января 2010

Я провел тесты производительности.Они были опубликованы в PostSharp Blog

Некоторые аспекты могут иметь ту же производительность, что и рукописный код, если они не используют такие функции, как: отражение, доступ к параметрам метода, доступ к экземпляру метода,Поскольку PostSharp испускает инструкции MSIL, сгенерированный код может быть встроен JIT-компилятором.

Как напоминается в других ответах, убедитесь, что (1) PostSharp действительно вызывается (используйте Reflector в полученной сборке) и (2) вы используете секундомер правильно.Если вы сравниваете среднее время одного теста, то, как правило, разница между PostSharp и рукописным кодом составляет всего несколько наносекунд (в предположении, что вы не используете дорогие функции).

-gael

1 голос
/ 19 января 2010

На процессоре с тактовой частотой 3 ГГц только 40 миллиардов тактов займут 13 секунд - и я искренне сомневаюсь, что одна итерация занимает всего один такт. Что-то определенно не так с вашим тестом.

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

0 голосов
/ 19 января 2010

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

...