DateTime.Now лучший способ измерить производительность функции?

Кроме ответа bde вы также можете использовать метод расширения, который позволяет вам установить привязку непосредственно на FrameworkElement

public static void SetBinding(this FrameworkElement target, DependencyProperty property, TargetType source, Expression<Func<TargetType, PropertyType>> property_accessor)
{
  var binding = new Binding(source.PropertyName(property_accessor));
  binding.Source = source;
  target.SetBinding(property, binding);
}


public static string PropertyName(this TargetType obj, Expression<Func> property_accessor)
 { 
return ((MemberExpression)property_accessor.Body).Member.Name; 
}

Вместо ввода

 BindingOperations.SetBinding(txt1, TextBlock.TextProperty, b1);
 BindingOperations.SetBinding(txt2, TextBlock.TextProperty, b2); 

вы можете использовать метод расширения SetBinding, который определен выше

txt1.SetBinding(TextBlock.TextProperty, myADS, x => x.DeviceConfigured);
txt2.SetBinding(TextBlock.TextProperty, myADS, x => x.ProcessingData);

Таким образом, вы избегаете передавать имя свойства как строку.

462
задан Peter Mortensen 21 December 2011 в 20:36
поделиться

11 ответов

Нет, это не. Используйте Секундомер 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  мс. См. сообщение в блоге John Chapman [приблизительно 114] точность для большой сводки.

Интересные мелочи: секундомер возвращается DateTime.UtcNow, если Ваши аппаратные средства не поддерживают высокочастотный счетчик. Можно проверить, чтобы видеть, использует ли Секундомер аппаратные средства для достижения высокой точности путем рассмотрения статического полевого Секундомера. IsHighResolution.

637
ответ дан Peter Mortensen 21 December 2011 в 20:36
поделиться
  • 1
    @Vladimir, я не уверен, что банка должна быть наверху списка. Все еще большой ответ, спасибо. – Gökhan Barış Aker 7 April 2012 в 08:00

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

А Google действительно показывает много ресурсов/статей для проверки производительности.

Многие упоминают, что использовали pinvoke для получения информации производительности. Много материалов я изучаю только действительно упоминание с помощью perfmon..

Редактирование:

Замеченный переговоры о StopWatch.. Хороший! Я изучил что-то:)

Это похоже на хорошую статью

4
ответ дан Rob Cooper 21 December 2011 в 20:36
поделиться

Sean Chambers

к вашему сведению, класс Таймера.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);
}

, Таким образом, это действительно не помогает Вам знать, сколько времени что-то взяло, просто что определенное количество времени передало.

таймер также представлен как управление в Системе. Windows. Формы... можно найти его на панели инструментов разработчика на VS05/VS08

7
ответ дан Community 21 December 2011 в 20:36
поделиться

Используйте Систему. Диагностика. Класс секундомера.

Stopwatch sw = new Stopwatch();
sw.Start();

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.
13
ответ дан rp. 21 December 2011 в 20:36
поделиться

Так же Секундомер, это - путь лучше.

Относительно производительности, измеряющей Вас, должен также проверить, является ли Ваш "//Некоторый Процесс Выполнения" очень коротким процессом.

Также принимают во внимание, что первый показ Ваш "//Некоторый Процесс Выполнения" мог бы быть путем медленнее, чем последующие выполнения.

я обычно тестирую метод путем выполнения его 1000 раз или 1000000 раз в цикле, и я получаю намного более точные данные, чем выполнение его однажды.

10
ответ дан Andrei Rînea 21 December 2011 в 20:36
поделиться

Полезно продвинуть Ваш код сравнительного тестирования в служебный класс/метод. StopWatch класс не должен быть Disposed или Stopped на ошибке. Так, самый простой код к время [приблизительно 118], которые действие

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);
}
18
ответ дан Anthony Mastrean 21 December 2011 в 20:36
поделиться

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

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

, С другой стороны, при необходимости в чем-то немного более сложном необходимо, вероятно, рассмотреть использование стороннего профилировщика такой как МУРАВЬИ .

90
ответ дан Omar 21 December 2011 в 20:36
поделиться

секундомер функциональность была бы лучше (более высокая точность). Я также рекомендовал бы просто загрузить одного из популярных профилировщиков, хотя ( DotTrace и МУРАВЬИ являются теми, я использовал больше всего..., бесплатная демонстрационная версия для DotTrace полностью функциональна и не ворчит как некоторые из других).

16
ответ дан jsight 21 December 2011 в 20:36
поделиться

Система Команды Visual Studio имеет некоторые функции, которые могут помочь с этой проблемой. По существу можно записать модульные тесты и смешать их в различных сценариях для выполнения против программного обеспечения как часть стресс-теста или нагрузочного теста. Это может помочь определить области кода, которые влияют на Вашу производительность приложений больше всего.

Microsoft' Шаблоны и группа Методов имеет некоторое руководство в Руководство Тестирования Производительности системы Команды Visual Studio .

6
ответ дан Peter Mortensen 21 December 2011 в 20:36
поделиться

Это все отличные способы измерить время, но это - только очень косвенный способ найти узкое место (места).

самый прямой способ найти bottneck в потоке состоит в том, чтобы получить его выполнение, и в то время как он делает то, что заставляет Вас ожидать, остановить его с клавишей Pause или клавишей Break. Делайте это несколько раз. Если Ваше узкое место берет X % времени, X % вероятность, что Вы застанете его на месте на каждом снимке.

Вот более полное объяснение того, как и почему оно работает

9
ответ дан Community 22 December 2011 в 07:36
поделиться
  • 1
    Отредактированный мой ответ для объяснения одной техники. – aredridel 8 January 2012 в 16:19
Другие вопросы по тегам:

Похожие вопросы: