Мне нужно провести несколько тестов производительности программ .NET (C#) в Windows, но я не очень много тестировал в мире Windows. Я изучал возможность использования монитора производительности Windows 2000 / XP с настраиваемыми счетчиками для этого, но не думаю, что это именно то, что мне нужно.
Есть ли в Windows XP какие-либо хорошие системные средства для этого, или мне нужно просто использовать System.Diagnostics.Stopwatch [edit] и писать текстовые журналы для ручной интерпретации, или есть что-то еще?
Обновлено: есть ли что-нибудь помимо System.Diagnostics.Stopwatch?
Агх, еще один урок параллелизма пошёл не так, как надо ...
@ Майкл Ратанапинта: нужно уточнить?
Когда я начал писать свой первый комментарий, вопрос все еще был закрыт, но когда я его разместил, вы его снова открыли.
Ох, хорошо. Я просто закрыл его, чтобы можно было быстро отредактировать, чтобы предотвратить поток "используйте секундомер!" Комментарии. Я уже знал о секундомере.





using System.Diagnostics;
....
Stopwatch sw = new Stopwatch();
sw.Start();
// Code you want to time...
// Note: for averaged accuracy (without other OS effects),
// run timed code multiple times in a loop
// and then divide by the number of runs.
sw.Stop();
Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks");
Вы также должны отделить первый прогон от усредненных результатов, так как он может быть сильно искажен из-за процесса JIT-компиляции.
Эд. СУБЪЕКТ: Хорошее замечание, но не обязательно. Если в действительности код выполняется только один раз, то, вероятно, необходимо учесть время JIT.
Конечно, я не хотел полностью игнорировать эту информацию, просто чтобы убедиться, что она отделена, чтобы она не увеличивала средний показатель. Пока человек, проводящий тест, знает об этом факте, все будет в порядке. Я настраивал процедуру синтаксического анализа XML, которая может быть вызвана для некоторых довольно больших фрагментов данных (в любом случае относительно того, что типично для моего приложения), и первый проход занял ~ 931 мс, в то время как все последующие вызовы заняли ~ 91 мс.
Чему соответствует одна галочка?
Возможно, это не то, что вам нужно, но dotTrace предлагает множество полезных диагностических средств и интегрирован в Visual Studio.
Профайлеров довольно много. Вот некоторые из них, о которых я знаю:
Если вы продолжите использовать System.Diagnostics.Stopwatch, вы сможете измерять и измерять только определенные точки вашего кода, где вы явно указываете Start / Stop. Этого достаточно для измерения конкретных частей, таких как замкнутый цикл или тому подобное, но он не даст вам полного представления о том, где ваша программа проводит большую часть своего времени.
Для микротестирования мне очень нравится MeasureIt (можно скачать с http://msdn.microsoft.com/en-us/magazine/cc500596.aspx). Это тестовый проект, написанный Вэнсом Моррисоном, архитектором производительности среды CLR. В настоящее время он имеет хороший набор тестов для ряда основных методов .Net / CLR. Самое приятное в том, что настраивать и добавлять новые тесты для всего, что вы хотите протестировать, несложно. Просто запустите «MeasureIt / edit», и он запустит VS с проектом для себя, чтобы вы могли увидеть, как написаны эти тесты, и добавить новые аналогично, если хотите.
Как уже было сказано, StopWatch, вероятно, самый простой способ сделать это, и MeasureIt использует StopWatch внизу для своих таймингов, но он также делает некоторые другие вещи, например, запускает блок кода X раз, а затем предоставляет вам статистику для прогонов, а что нет.
Если вам нужны быстрые цифры, вы можете использовать Powershell для определения времени выполнения в целом. Используйте командлет measure-command. Это примерно эквивалентно «времени» в Unix.
> measure-command { your.exe arg1 }
Days : 0
Hours : 0
Minutes : 0
Seconds : 4
Milliseconds : 996
Ticks : 49963029
TotalDays : 5.78275798611111E-05
TotalHours : 0.00138786191666667
TotalMinutes : 0.083271715
TotalSeconds : 4.9963029
TotalMilliseconds : 4996.3029
Если ваш проект довольно большой, и в нем много модулей, выполняющих большое количество вызовов, вы можете: http://www.moduleanalyzer.com/
Чтобы другие люди могли получить дополнительные ответы, я думаю, что вам будет лучше снова открыть вопрос.