Harun Reşit Zafer

bâki kalan bu kubbede bir hoş sadâ imiş

Java ile Geçen Sürenin Ölçülmesi

Java’da, geçen zamanın hesaplanması için iki temel metot System.currentTimeMillis() ve  System.nanoTime()’dır. Her ikisinin de kullanımı benzer şekilde.  Bu yazıda her ihtiyacımız olduğunda kullanabileceğimiz bir Kronometre (Timer) sınıfını tanıtmak istiyorum. Öncelikle bu iki metotun doğrudan kullanımlarını görelim:

currentTimeMillis

long startTime = System.currentTimeMillis(); 
 // ... zaman alan bazı işlemler ... 
 long endTime = System.currentTimeMillis();
 long estimatedTime = endTime - startTime; // Geçen süreyi milisaniye cinsinden elde ediyoruz
 double seconds = (double)estimatedTime/1000; // saniyeye çevirmek için 1000'e bölüyoruz.

nanoTime

long startTime = System.nanoTime(); 
 // ... zaman alan bazı işlemler ... 
 long endTime = System.nanoTime(); 
 long estimatedTime = endTime - startTime; // Geçen süreyi nanosaniye cinsinden elde ediyoruz
 double seconds = (double)estimatedTime/1000000000; // saniyeye çevirmek için milyar'a bölüyoruz.

Bir Kronometre Sınıfı

Ayrıntısına çok hakim olmamakla beraber ikinci yöntemin, yani System.nanoTime()’ın daha isabetli sonuçlar verdiğini biliyorum. Zaman ölçümünü daha basit ve kullanışlı bir hale getirebilmek için Timer isimli bir static sınıf kodladım. Sınıfı Javanta kütüphanesine de dahil ettim. Arzu ederseniz kütüphaneyi projenize ekleyerek veya aşağıdaki sınıfı doğrudan kodunuza dahil ederek kullanabilirsiniz. Sınıfın koduna geçmeden önce kullanımına bir göz atalım:

 Timer.start(); 
 //... zaman alan bazı işlemler ... 
 Timer.stop();
 double seconds = Timer.getElapsedSeconds();
 System.out.println("Geçen süre " + seconds + " saniyedir" );

Timer.java

/**
 * Kronometre vazifesi gören bu sınıf geçen süreyi nanosaniye, milisaniye ya da saniye cinsinden hesaplar.
 * @author hrzafer
 */
public class Timer {
 
    private static long start;
    private static long end;
    private static boolean started;
 
    /**
     * Kronometre durmuş vaziyette mi?
     */
    private static boolean isStopped() {
        return !started;
    }
 
    /**
     * Kronometre başlamış vaziyette mi?
     * @return 
     */
    private static boolean isStarted() {
        return started;
    }
 
    /**
     * Kronometreyi başlatır. Eğer zaten başlamış durumda ise RunTimeException hatası atar.
     */
    public static void start() {
        if (isStopped()) {
            startTimer();
        } else {
            throw new RuntimeException("Hata: Kronometre (Timer) zaten başlatılmış durumda!!!\n");
        }
    }
 
    private static void startTimer() {
        start = System.nanoTime();
        started = true;
    }
 
    /**
     * Kronometreyi durdurur. Eğer zaten başlamamış ise RunTimeException hatası atar.
     */
    public static void stop() {
        if (isStarted()) {
            stopTimer();
        } else {
            throw new RuntimeException("Hata: Kronometre (Timer) başlatılmadı!!!\n");
        }
    }
 
    private static void stopTimer() {
        end = System.nanoTime();
        started = false;
    }
 
    /**
     * Timer.start() ile Timer.stop() arasında geçen süreyi nanosaniye olarak döndürür.
     */
    public static long getElapsedTime() {
        if (isStopped()) {
            return end - start;
        } else {
            throw new RuntimeException("Hata: Kronometre (Timer) durdurulmadı!!!\n");
        }
 
    }
 
    /**
     * Timer.start() ile Timer.stop() arasında geçen süreyi milisaniye cinsinden döndürür.
     */
    public static double getElapsedMilliseconds() {
        double seconds = (double) getElapsedTime() / 1000000.0;
        return seconds;
    }
 
    /**
     * Timer.start() ile Timer.stop() arasında geçen süreyi saniye cinsinden döndürür.
     */
    public static double getElapsedSeconds() {
        double seconds = (double) getElapsedTime() / 1000000000.0;
        return seconds;
    }  
}

Umarım faydalı olmuştur. Herkese kolay gelsin.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPrint this pageEmail this to someone

4 Yorum

  1. Hocam çalışmalarınızı takdir ediyorum.

    Şöyle bir önerim var: timer ikinci kez başlatılmak istendiğinde hata vermek yerine tüm startlar bir stackta tutulup, her stopta pop edilebilir. Böylece bir işlemin süresi ölçülürken aynı zamanda alt işlemlerin de süreleri ölçülebilmiş olur.

    Kolay gelsin.

    • admin

      13 Aralık 2012 at 14:40

      Fikir çok güzel ancak böyle bir Timer class’ı bug’lara davetiye çıkarır. Sınıfı kullanacak programcı açısından düşündüğümüzde her start() için bir stop() gerekir ki bunların parantezler gibi nested (iç -içe) olmasında da gerek yok. Bunun yerine fonksiyona getLapTime() gibi kronometre stop() etmediği halde o anki geçen süreyi veren bir metod eklemek daha güvenli bir çözüm olabilir.

  2. Hocam teşekkür ederim, sınıfı biraz değiştirerek ödevimde kullandım. ileride lazım olacak bi sınıf

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacak

*

© 2017 Harun Reşit Zafer

Temayı tasarlayanAnders NorenYukarı ↑