2010-01-19 5 views
3

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

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

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

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

Спасибо.

+2

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

ответ

1

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

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

+0

Как я уже сказал, строки не фиксированы. Они включают случайные числа. Кроме того, сборки Debug в VS ничего не оптимизируют. Они очень глупы, поэтому они являются хорошей ссылкой на последовательность. –

+0

@Alex: Возможно, вы должны включить скелет своего тестового кода. Без специфики, я думаю, nobugz и я сказал столько, сколько можно сказать. Время работы в несколько миллисекунд для 40-миллиметровых итераций невозможно, так как это дельта всего несколько нс между тестами. – Aaronaught

+0

Еще одна вещь - сколько времени требуется для выполнения всего теста (n = 40 миллиардов)? Выполнение * ничего *, что много раз, вероятно, займет не менее нескольких минут; если это происходит быстрее, чем тогда, то это, вероятно, не работает много раз. – Aaronaught

1

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

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

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

-gael

0

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

Смежные вопросы