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.
13 Aralık 2012 at 09:43
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.
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.
18 Aralık 2012 at 03:32
http://www.hrzafer.com/java-ve-sqlite-ornek-veritabani-uygulamasi#comments
24 Aralık 2015 at 17:03
Hocam teşekkür ederim, sınıfı biraz değiştirerek ödevimde kullandım. ileride lazım olacak bi sınıf