Кроме ответа 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);
Таким образом, вы избегаете передавать имя свойства как строку.
Нет, это не. Используйте Секундомер (в 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.
Я сделал очень мало этого вида проверки производительности (я склонен просто думать, что "это медленно, сделайте его быстрее"), таким образом, я в значительной степени всегда шел с этим.
А Google действительно показывает много ресурсов/статей для проверки производительности.
Многие упоминают, что использовали pinvoke для получения информации производительности. Много материалов я изучаю только действительно упоминание с помощью perfmon..
Замеченный переговоры о StopWatch.. Хороший! Я изучил что-то:)
к вашему сведению, класс Таймера.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
Используйте Систему. Диагностика. Класс секундомера.
Stopwatch sw = new Stopwatch();
sw.Start();
// Do some code.
sw.Stop();
// sw.ElapsedMilliseconds = the time your "do some code" took.
Так же Секундомер, это - путь лучше.
Относительно производительности, измеряющей Вас, должен также проверить, является ли Ваш "//Некоторый Процесс Выполнения" очень коротким процессом.
Также принимают во внимание, что первый показ Ваш "//Некоторый Процесс Выполнения" мог бы быть путем медленнее, чем последующие выполнения.
я обычно тестирую метод путем выполнения его 1000 раз или 1000000 раз в цикле, и я получаю намного более точные данные, чем выполнение его однажды.
Полезно продвинуть Ваш код сравнительного тестирования в служебный класс/метод. 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);
}
Если бы Вы хотите что-то быстрое и грязное, я предложил бы использовать Секундомер вместо этого для большей степени точности.
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
, С другой стороны, при необходимости в чем-то немного более сложном необходимо, вероятно, рассмотреть использование стороннего профилировщика такой как МУРАВЬИ .
секундомер функциональность была бы лучше (более высокая точность). Я также рекомендовал бы просто загрузить одного из популярных профилировщиков, хотя ( DotTrace и МУРАВЬИ являются теми, я использовал больше всего..., бесплатная демонстрационная версия для DotTrace полностью функциональна и не ворчит как некоторые из других).
Система Команды Visual Studio имеет некоторые функции, которые могут помочь с этой проблемой. По существу можно записать модульные тесты и смешать их в различных сценариях для выполнения против программного обеспечения как часть стресс-теста или нагрузочного теста. Это может помочь определить области кода, которые влияют на Вашу производительность приложений больше всего.
Microsoft' Шаблоны и группа Методов имеет некоторое руководство в Руководство Тестирования Производительности системы Команды Visual Studio .
Я просто нашел сообщение в блоге Vance Morrison [приблизительно 111] класс CodeTimer, он записал, что это делает использование StopWatch
легче и делает некоторый аккуратный материал на стороне.
Это все отличные способы измерить время, но это - только очень косвенный способ найти узкое место (места).
самый прямой способ найти bottneck в потоке состоит в том, чтобы получить его выполнение, и в то время как он делает то, что заставляет Вас ожидать, остановить его с клавишей Pause или клавишей Break. Делайте это несколько раз. Если Ваше узкое место берет X % времени, X % вероятность, что Вы застанете его на месте на каждом снимке.