У меня есть приложение для тестирования производительности некоторых API, которые я написал. В этом тестовом приложении я в основном использую QueryPerformanceCounter и получаю время путем деления разности значений QPC после и до вызова в API по частоте. Но результаты бенчмаркинга могут отличаться, если я запускаю приложение (один и тот же исполняемый файл, работающий на одном и том же наборе Dll) с разных дисков. Кроме того, на конкретном диске запуск приложения в первый раз, закрытие приложения и его повторный запуск приводит к другим результатам тестирования. Кто-нибудь может объяснить это поведение? Я что-то здесь упускаю?
Еще немного полезной информации:
Поведение выглядит следующим образом: запустите приложение, закройте его и запустите его снова, результаты бенчмаркинга улучшатся на втором прогоне и после этого останутся такими же. Такое поведение более заметно в случае запуска с диска C.
Я также хотел бы отметить, что в моем тестовом приложении есть возможность перезапустить / повторно протестировать определенный API, не закрывая приложение. Я понимаю, что это связано с джиттингом, но я не понимаю, что при первом запуске приложения, когда вы перезапускаете API несколько раз, не закрывая приложение, производительность стабилизируется после нескольких запусков, затем при закрытии и повторном запуске тот же тест, производительность, кажется, улучшается.
Кроме того, как вы учитываете изменение производительности при запуске с разных дисков?
[ОБНОВЛЕНИЕ ИНФОРМАЦИИ]
Я сделал ngen , и теперь разница в производительности между различными прогонами из одного и того же места исчезла. Т.е., если я открою приложение для тестирования производительности, запусту его один раз, закрою и перезапущу из того же места, оно показывает те же значения.
Но я столкнулся с другой проблемой сейчас. Когда я запускаю приложение с диска D и запускаю его пару раз (несколько итераций API в рамках одного и того же запуска проги тестов), а затем, начиная с 3-й итерации, производительность всех API падает примерно на 20%. , Затем, если вы закроете и снова запустите приложение и запустите его, для первых 2 итераций оно даст правильные значения (то же самое, что и значение, полученное из C), а затем производительность снова выйдет за пределы этого. Такое поведение не видно при запуске с диска C. С диска C, независимо от того, сколько прогонов вы берете, он довольно последовательный.
Я использую большие двойные массивы для проверки производительности моего API. Я беспокоился, что GC будет вставлять между тестами, поэтому я вызываю GC.Collect () & GC.WaitForPendingFinalizers () явно до и после каждого теста. Так что я не думаю, что это имеет какое-либо отношение к GC.
Я пытался использовать время AQ, чтобы узнать, что происходит с 3-й итерации, но забавно то, что когда я запускаю приложение с AQ, время профилирования, производительность не падает вообще.
Счетчик производительности as не предлагает никаких забавных операций ввода-вывода.
Спасибо
Niranjan