Kesin zaman tutma, olay günlüğünden performans ölçümüne kadar çeşitli programlama görevleri için çok önemlidir. Saniye genellikle yeterli olsa da, birçok uygulama doğru zamanlama için milisaniye hassasiyeti gerektirir. Bu makale, bunu C#’ta nasıl başarabileceğinizi ele almaktadır.
İçindekiler Tablosu
- C#’ta Tarih ve Zaman Temelleri
- C#’ta Milisaniyelerle Çalışmak
- Pratik Örnekler: Milisaniyelerin Elde Edilmesi
- Doğru Yöntemi Seçmek
C#’ta Tarih ve Zaman Temelleri
C#, DateTime
ve DateTimeOffset
yapıları aracılığıyla sağlam tarih ve zaman işleme olanağı sunar. Bunlar, tarih ve zaman bilgilerini işlemek için çeşitli özellikler ve yöntemler sağlar. Bununla birlikte, milisaniyelere doğrudan erişim, bu araçların daha derinlemesine anlaşılmasını gerektirir.
C#’ta Milisaniyelerle Çalışmak
Temel kavram, Ticks
özelliğinin anlaşılmasında yatmaktadır. Bir DateTime
yapısı zaman içinde bir noktayı temsil eder ve Ticks
, 1 Ocak 0001, gece yarısı 12:00:00’dan bu yana geçen 100 nanosaniyelik aralık sayısını döndürür. Milisaniyeleri elde etmek için, Ticks
değerini TimeSpan.TicksPerMillisecond
(10.000) değerine böleriz.
Pratik Örnekler: Milisaniyelerin Elde Edilmesi
Yöntem 1: DateTime.Now.Ticks
Kullanımı
Bu, geçerli zamanı milisaniye cinsinden elde etmek için en basit yaklaşımdır:
using System;
public class MillisecondsExample
{
public static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
long milliseconds = ticks / TimeSpan.TicksPerMillisecond;
Console.WriteLine($"Geçerli zaman milisaniye cinsinden: {milliseconds}");
}
}
Yöntem 2: Geçen Süre için Stopwatch
Kullanımı
Stopwatch
sınıfı, geçen süreyi ölçmede mükemmeldir ve DateTime.Now
‘ı doğrudan kullanmaya kıyasla kısa süreler için daha iyi hassasiyet sunar. Bu, performans kıyaslaması için idealdir.
using System;
using System.Diagnostics;
public class StopwatchExample
{
public static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// Zamanlanacak kod...
System.Threading.Thread.Sleep(500); // Bazı işlemleri simüle et
stopwatch.Stop();
long milliseconds = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Geçen süre milisaniye cinsinden: {milliseconds}");
}
}
Yöntem 3: Yüksek Çözünürlüklü Zamanlayıcı (Gelişmiş İhtiyaçlar için)
Aşırı hassasiyet için QueryPerformanceCounter
API’sini göz önünde bulundurun. Ancak, bunun platform bağımlı olduğunu ve doğruluğun donanıma bağlı olarak değiştiğini unutmayın. Mikro saniye veya nano saniye hassasiyetine ihtiyacınız olmadıkça genellikle gerekli değildir.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class HighResolutionTimerExample
{
public static void Main(string[] args)
{
long frequency;
long startTime;
long endTime;
QueryPerformanceFrequency(out frequency);
QueryPerformanceCounter(out startTime);
// Zamanlanacak kod...
System.Threading.Thread.Sleep(500); // Bazı işlemleri simüle et
QueryPerformanceCounter(out endTime);
long elapsedTicks = endTime - startTime;
double elapsedMilliseconds = (double)elapsedTicks / frequency * 1000;
Console.WriteLine($"Geçen süre milisaniye cinsinden: {elapsedMilliseconds}");
}
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
}
Doğru Yöntemi Seçmek
Uygulamanızın ihtiyaçlarına en uygun yöntemi seçin. Çoğu senaryo için DateTime.Now.Ticks
veya Stopwatch
yeterli doğruluğu sağlar. Sadece aşırı hassasiyet (mikro saniye veya nano saniye) kesinlikle gerekli olduğunda QueryPerformanceCounter
kullanın.