2010-04-05 22 views
5

C# world cihazında yeni ürünler yapıyorum. Karşılaştırma amacıyla bir algoritma tarafından alınan zamanı hesaplamaya çalışıyorum. Aşağıdaki kod, alt programın ana programa geri dönünceye kadar bir alt programın çağrılmasından itibaren geçen süreyi ölçer. Bu örnek, Michael McMillan tarafından "C# ile veri yapıları" dan alınmıştır. Bu program çalıştırıldıktan sonra çıktı, yanlış olan Time = 0'dır. Program mantıksal olarak doğru gibi görünüyor. Birisi bana yardım edebilir mi. Aşağıdaki sadece ana işlevi yerde Timing sınıfını kullanmayın ve ya zaman yazdırmak nerede görmüyorum kodBir işlemin tamamlanması için gereken süre

using System; 
using System.Diagnostics; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Chap1 
{ 
    class chap1 
    { 
     static void Main() 
     { 
      int[] nums = new int[100000]; 
      BuildArray(nums); 
      Timing tObj = new Timing(); 
      tObj.startTime(); 
      DisplayNums(nums); 
      tObj.stopTime(); 
      Console.WriteLine("Time: " + tObj.result().TotalSeconds); 
      Console.WriteLine("Start Time: " + tObj.startTime().TotalSeconds); 
      Console.WriteLine("Duration : " + tObj.result().TotalSeconds); 
      Console.ReadKey(); 
     } 
     static void BuildArray(int[] arr) 
     { 
      for (int i = 0; i <= 99999; i++) 
       arr[i] = i; 
     } 
     static void DisplayNums(int[] arr) 
     { 
      for (int i = 0; i <= arr.GetUpperBound(0); i++) 
       Console.WriteLine(arr[i]); 
     } 
    } 
class Timing 
    { 
     TimeSpan StartTiming; 
     TimeSpan duration; 
     public Timing() 
     { 
      StartTiming = new TimeSpan(0); 
      duration = new TimeSpan(0); 
     } 
     public TimeSpan startTime() 
     { 
      GC.Collect(); 


    GC.WaitForPendingFinalizers(); 
      StartTiming = Process.GetCurrentProcess().Threads[0].UserProcessorTime; 
      return StartTiming; 
     } 
     public void stopTime() 
     { 
      duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(StartTiming); 

     } 
     public TimeSpan result() 
     { 
      return duration; 
     } 
    } 
} 
+0

Hata ayıklama modunda çalıştırmayın (bazı çevrimiçi kaynaklara göre). – Kiril

+0

Aynı sorunu yaşadım! Ben Voigt haklı, doğru değilsiniz, dizin 0 (INDEX, değil Thread ID!) Ile ilgilendiren bir konu olduğunu düşünüyorum. Doğru iş parçacığı kimliğini almak için şimdi bir PInvoke GetCurrentThreadId() kullanıyorum . Daha sonra tüm iş parçacıklarını çözüyorum ve bu iş parçacığı kimliğine sahip olanı kontrol ediyorum. – Jane

cevap

3

Stopwatch class bunun için tasarlanmıştır.

UserProcessorTime, bir for döngüsünde 100000'e kadar saymayı ölçmek için gerekli çözünürlüğe sahip olmaya başlamaz. WriteLine çağrılarınız kullanıcı zamanına I/O zamanı olarak eklenmeyecektir. Kodunuz iş parçacığı 0'da çalışmıyor olabilir. Kullanıcıların içerik anahtarları haricinde güncellenmez. StartTime'ı yazdırdığınızda, kayıtlı değeri değiştirirsiniz. Muhtemelen düşünemediğim başka şeyler olabilir.

CPU'nun performans sayaçlarından yararlanan Kronometre sınıfını kullanmanızı şiddetle öneririm.

+0

@Ben OP bu örneğin neden çalışmadığını soruyor. – Kiril

+0

Sevgili Ben, şu an düzenlediğim doğru koda başvurabilirseniz, başvuru yapacağım. Teşekkürler –

+0

.NET ortamında, her program uygulama etki alanı içinde çalışır. Bu, işletim sisteminin aynı anda üzerinde çalışan farklı programı ayırmasına izin verir. Bir işlem içinde, bir iş parçacığının içinde bir programı veya bir programın parçası çalıştırılır. Bir program için yürütme süresi, iş parçacığı tarafından işletim sistemi tarafından tahsis edilir.Bir programın kodunu zamanladığımızda, yalnızca programımız için tahsis edilen süreç içindeki kodun zamanlamasını yaptığımızdan ve işletim sistemi tarafından gerçekleştirilen diğer görevlerin yerine getirilmediğinden emin olmak istiyoruz. Kronometre sınıfını kullanarak toplam süre içinde başka zamanları da içerecektir. –

2

olduğunu. EXACT kodunuz çalışıyor mu? Yeni kodu başına

Güncelleme:

... ayıklama modunda çalıştırın sizin sürümünü kurmak ve daha sonra elle yürütülebilir çalıştırmayın: Ben kodunuzu test http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/3f10a46a-ba03-4f5a-9d1f-272a348d660c/

ve iyi çalıştı yayın sürümünü çalıştırırken, ancak hata ayıklayıcısında çalıştırdığımda düzgün çalışmıyordu.

+0

Hatalı kod göndermek için üzgünüz. Şimdi tam kodu gönderdim –

+0

Çoğu zaman konsol çıkışı - yani "kullanıcı" zamanında dahil olmayan bir çekirdek WriteFile (CONOUT $) çağrısı yapmak için harcanan çünkü. –

+0

@Ben Debug modunda kod çalıştırmanın zamanı göstermeyeceğini belirten bu makaleyi okudum: http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/3f10a46a-ba03-4f5a-9d1f -272a348d660c/ – Kiril

İlgili konular