Aşağıdaki programı çalıştırdığımda ve performans sayacına baktığımda, sonuçlar bana mantıklı gelmiyor. Ortalama değer sıfırdır ve min/max değerleri ~ 0,1 veya ~ 100 beklediğimde ~ 0.4'tür.System.Diagnostics.Stopwatch ile AverageTimer32 ve AverageBase performans sayaçlarını nasıl kullanılır?
Sorunum nedir?
Kod
class Program
{
const string CategoryName = "____Test Category";
const string CounterName = "Average Operation Time";
const string BaseCounterName = "Average Operation Time Base";
static void Main(string[] args)
{
if (PerformanceCounterCategory.Exists(CategoryName))
PerformanceCounterCategory.Delete(CategoryName);
var counterDataCollection = new CounterCreationDataCollection();
var avgOpTimeCounter = new CounterCreationData()
{
CounterName = CounterName,
CounterHelp = "Average Operation Time Help",
CounterType = PerformanceCounterType.AverageTimer32
};
counterDataCollection.Add(avgOpTimeCounter);
var avgOpTimeBaseCounter = new CounterCreationData()
{
CounterName = BaseCounterName,
CounterHelp = "Average Operation Time Base Help",
CounterType = PerformanceCounterType.AverageBase
};
counterDataCollection.Add(avgOpTimeBaseCounter);
PerformanceCounterCategory.Create(CategoryName, "Test Perf Counters", PerformanceCounterCategoryType.SingleInstance, counterDataCollection);
var counter = new PerformanceCounter(CategoryName, CounterName, false);
var baseCounter = new PerformanceCounter(CategoryName, BaseCounterName, false);
for (int i = 0; i < 500; i++)
{
var sw = Stopwatch.StartNew();
Thread.Sleep(100);
sw.Stop();
Console.WriteLine(string.Format("t({0}) ms({1})", sw.Elapsed.Ticks, sw.Elapsed.TotalMilliseconds));
counter.IncrementBy(sw.Elapsed.Ticks);
baseCounter.Increment();
}
Console.Read();
}
}
Performans Sayacı Ekran Performance Counter Screenshot http://friendfeed-media.com/50028bb6a0016931a3af5122774b56f93741bb5c
işaretlenmemiş ((Int32 döküm gerek Neden ..: Bir sayıcı zaman
, o böyle bunu yaparken tavsiye .)? performanceCounterTicks uzun olarak değerlendirilir, tüm değerler aslında uzun sayılardır. –
@DavideIcardi: Teşekkürler, 'IncrementBy' yönteminin imzasının bir "Int64" kabul ettiğini, dolayısıyla bir cast yapmaya gerek olmadığını doğru söylüyorsunuz. Oyuncuyu koddan kaldırdım. –
Güzel! tam aradığım şey! – vtortola