Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Является ли DateTime.Now лучшим способом измерения производительности функции?
Мне нужно найти узкое место и нужно как можно точнее измерить время.
Является ли следующий фрагмент кода лучшим способом измерения производительности?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
Нет, это не так. Используйте секундомер (in System.Diagnostics )
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
Секундомер автоматически проверяет наличие высокоточных таймеров.
Стоит отметить, что DateTime.Now часто немного медленнее, чем DateTime.UtcNow , из-за работы, которую приходится выполнять с часовыми поясами, DST и так далее.
DateTime.UtcNow обычно имеет разрешение 15 ms. см. Запись В блоге Джона Чапмена о точности DateTime.Now для получения отличного резюме.
Интересные мелочи: секундомер возвращается на DateTime.UtcNow , если ваше оборудование не поддерживает высокочастотный счетчик. Вы можете проверить, использует ли секундомер аппаратное обеспечение для достижения высокой точности, посмотрев на статическое поле Stopwatch.IsHighResolution .
Если вы хотите что-то быстрое и грязное, я бы предложил использовать секундомер вместо этого для большей степени точности.
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
Кроме того, если вам нужно что-то немного более сложное, вы, вероятно, должны рассмотреть возможность использования стороннего профилировщика, такого как ANTS .
В этой статье говорится, что прежде всего вам нужно сравнить три альтернативы, Stopwatch , DateTime.Now AND DateTime.UtcNow .
Это также показывает, что в некоторых случаях (когда счетчик производительности не существует) секундомер использует DateTime.UtcNow + некоторую дополнительную обработку. Из-за этого очевидно, что в этом случае DateTime.UtcNow-лучший вариант (потому что другие используют его + некоторая обработка)
Однако, как оказалось, счетчик почти всегда существует - см. объяснение о счетчике производительности высокого разрешения и его существовании, связанном с секундомером .NET? .
Вот график производительности. Обратите внимание, насколько низкая стоимость производительности UtcNow по сравнению с альтернативными вариантами:
Ось X - это размер выборочных данных, а ось Y-относительное время выполнения примера.
Одна вещь Stopwatch лучше в том, что она обеспечивает более высокое разрешение временных измерений. Другое - его более OO природа. Однако создание оболочки OO вокруг UtcNow не может быть сложным.
Полезно поместить свой бенчмаркинговый код в служебную программу class/method. класс StopWatch не обязательно должен быть Disposed или Stopped при ошибке. Итак, самый простой код для определения времени некоторого действия -это
public partial class With
{
public static long Benchmark(Action action)
{
var stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch.ElapsedMilliseconds;
}
}
Пример кода вызова
public void Execute(Action action)
{
var time = With.Benchmark(action);
log.DebugFormat(“Did action in {0} ms.”, time);
}
Вот версия метода расширения
public static class Extensions
{
public static long Benchmark(this Action action)
{
return With.Benchmark(action);
}
}
И пример кода вызова
public void Execute(Action action)
{
var time = action.Benchmark()
log.DebugFormat(“Did action in {0} ms.”, time);
}
Функциональность секундомера была бы лучше (более высокая точность). Я бы также рекомендовал просто загрузить один из популярных профилировщиков, хотя ( DotTrace и ANTS -это те, которые я использовал больше всего... бесплатная пробная версия для DotTrace полностью функциональна и не ворчит, как некоторые другие).
То же самое с секундомером, он намного лучше.
Что касается измерения производительности, вы также должны проверить, является ли ваш "// некоторый процесс выполнения" очень коротким процессом.
Также имейте в виду, что первый запуск вашего "// некоторого процесса выполнения" может быть намного медленнее, чем последующие запуски.
Обычно я тестирую метод, запустив его 1000 или 1000000 раз в цикле, и получаю гораздо более точные данные, чем один раз.
Все это отличные способы измерения времени, но это лишь очень косвенный способ найти узкое место(узкие места).
Самый прямой способ найти ботнек в потоке-заставить его работать, и пока он делает то, что заставляет вас ждать, остановите его с помощью паузы или клавиши break. Сделайте это несколько раз. Если ваше узкое место занимает X% времени, X%-это вероятность того, что вы поймаете его в действии на каждом снимке.
Вот более полное объяснение того, как и почему это работает
FYI, класс таймера .NET не предназначен для диагностики, он генерирует события с заданным интервалом, как это (от MSDN ):
System.Timers.Timer aTimer;
public static void Main()
{
// Create a timer with a ten second interval.
aTimer = new System.Timers.Timer(10000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 2 seconds (2000 milliseconds).
aTimer.Interval = 2000;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
}
// Specify what you want to happen when the Elapsed event is
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}
Так что это действительно не поможет вам узнать, сколько времени что-то заняло, просто что прошло определенное количество времени.
Таймер также представлен в качестве элемента управления в System.Windows.Forms... вы можете найти его в своем дизайнерском ящике инструментов в VS05/VS08
Это правильный путь:
using System;
using System.Diagnostics;
class Program
{
public static void Main()
{
Stopwatch stopWatch = Stopwatch.StartNew();
// some other code
stopWatch.Stop();
// this not correct to get full timer resolution
Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);
// Correct way to get accurate high precision timing
Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
}
}
Для получения дополнительной информации используйте секундомер вместо DataTime для получения точного счетчика производительности .
Visual Studio Team System имеет некоторые функции, которые могут помочь в решении этой проблемы. По существу, вы можете написать модульные тесты и смешать их в различных сценариях для запуска с вашим программным обеспечением в рамках стресс-теста или нагрузочного теста. Это может помочь определить области кода, которые больше всего влияют на производительность ваших приложений.
Microsoft ' Patterns and Practices group имеет некоторые рекомендации в руководстве по тестированию производительности командной системы Visual Studio .
Я только что нашел запись в блоге Вэнса Моррисона о классе CodeTimer , который он написал, что делает использование StopWatch проще и делает некоторые аккуратные вещи на стороне.
Я очень мало занимался такого рода проверкой производительности (я склонен просто думать: "это медленно, сделайте это быстрее"), поэтому я почти всегда шел с этим.
Google действительно показывает много ресурсов/статей для проверки производительности.
Многие упоминают использование pinvoke для получения информации о производительности. Многие материалы, которые я изучаю, действительно упоминают только использование perfmon..
Редактировать:
Видел переговоры 27-го года.. Здорово! Я кое-чему научился :)
Это выглядит как хорошая статья
Это недостаточно профессионально:
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
Более надежной версией является:
PerformWork();
int repeat = 1000;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
PerformWork();
}
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds / repeat);
В моем реальном коде я добавлю вызов GC.Collect для изменения управляемой кучи в известное состояние и добавлю вызов Sleep, чтобы различные интервалы кода можно было легко разделить в профиле ETW.