/*
* Lisans bilgisi icin lutfen proje ana dizinindeki zemberek2-lisans.txt dosyasini okuyunuz.
*/
package net.zemberek.araclar;
import java.util.HashMap;
/**
* Hassas kronometre ihtiyaçları için tasarlanmıştır.
*
* Kullanmak için timeTracker.startClock(isim) dedikten sonra
* TimeTracker.stopClock(isim)'un döndürdüğü String'i geçen süreyi göstermek
* için kullanabilirsiniz. Stop'tan önce ara adımları izlemek istiyorsanız
* TimeTracker.getElapsedTimeString(isim) veya getElapsedTimeStringAsMillis
* metodlarini kullanabilirsiniz. Start ile başlattığınız saatleri isiniz
* bittigindemutlaka stop ile durdurmanız gerekiyor, çünkü ancak stop ile register
* olmuş bir saat nesnesini unregistr edebilirsiniz.
*
* Olusan saatler globaldir, yani programin icinde istediginiz her yerde
* kullanabilirsiniz.
*
* @author M.D.A
*/
public class TimeTracker {
public static int MAX_TIMETRACKER_USERS = 500;
private static HashMap users = new HashMap();
/**
* Yeni bir saat oluşturur ve listeye register eder.
* @param name : saat adı
*/
public static void startClock(String name) {
if (users.size() > MAX_TIMETRACKER_USERS) {
System.err.println("Max Saat izleyici sayısı aşıldı. (" + MAX_TIMETRACKER_USERS + ")");
return;
}
if (users.get(name) != null) {
System.err.println(name + " isminde bir zaman izleyici zaten var.");
return;
}
TimerElement timer = new TimerElement(name);
users.put(name, timer);
}
/**
* ismi verilen saat için başlangıçtan bu yana bu yana ne kadar zaman
* geçtiğini milisaniye cinsinden döndürür.
*
* @param name : saatin adı
* @return :Bir önceki tick'ten bu yana geçen süre (milisaniye cinsinden)
*/
public static long getElapsedTime(String name) {
TimerElement timer = users.get(name);
if (timer == null)
return -1;
timer.refresh();
return timer.getElapsedTime();
}
/**
* ismi verilen saatin en son kontrolünden bu yana ne kadar zaman geçtiğini
* milisaniye cinsinden döndürür.
*
* @param name : saatin adı
* @return :Bir önceki tick'ten bu yana geçen süre (milisaniye cinsinden)
*/
public static long getTimeDelta(String name) {
TimerElement timer = users.get(name);
if (timer == null)
return -1;
timer.refresh();
return timer.getDiff()/1000L;
}
/**
* ismi verilen saatin en son kontrolunden (baslangic veya bir onceki tick)
* bu yana ne kadar zaman gectiğini ve başlangıçtan bu yana geçen süreyi
* virgülden sonra 3 basamaklı saniyeyi ifade eden String cinsinden döndürür.
*
* @param name : saatin adı
* @return : Bir önceki tick'ten bu yana geçen süre (Binde bir hassasiyetli saniye cinsinden cinsinden)
*/
public static String getElapsedTimeString(String name) {
TimerElement timer = users.get(name);
if (timer == null)
return "Geçersiz Kronometre: " + name;
timer.refresh();
return "Delta: " + (double) timer.getDiff()/1000L + " s. Elapsed: " + (double) timer.getElapsedTime()/1000L + " s.";
}
/**
* @param name : saatin adı
* @return : Bir önceki tick'ten bu yana geçen süre (milisaniye cinsinden)
*/
public static String getElapsedTimeStringAsMillis(String name) {
TimerElement timer =users.get(name);
if (timer == null)
return "Geçersiz Kronometre: " + name;
timer.refresh();
return "Delta: " + timer.getDiff()/1000L + "ms. Elapsed: " + timer.getElapsedTime()/1000L + "ms.";
}
/**
* @param name : saatin adı
* @param itemCount : sure zarfında islenen nesne sayisi
* @return : baslangictan bu yana islenen saniyedeki eleman sayisi
*/
public static long getItemsPerSecond(String name, long itemCount) {
TimerElement timer = users.get(name);
if (timer == null)
return -1;
timer.refresh();
long items = 0;
if (timer.getElapsedTime() > 0)
items = (itemCount)* 1000L / timer.getElapsedTime();
return items;
}
/**
* Saati durdurur ve başlangıçtan bu yana geçen süreyi saniye ve ms
* cinsinden döndürür. Ayrıca saati listeden siler.
*
* @param name Saat ismi
* @return başlangıçtan bu yana geçen süre
*/
public static String stopClock(String name) {
TimerElement timer = users.get(name);
if (timer == null)
return name + " : Geçersiz Kronometre";
timer.refresh();
users.remove(name);
return "" + (float) timer.elapsedTime + "sn."
+ "(" + timer.elapsedTime + " ms.)";
}
}
/**
* isimlendirilmiş Zaman bilgisi taşıyıcı.
*
* @author MDA
*/
class TimerElement {
String name;
long startTime = 0;
long stopTime = 0;
long lastTime = 0;
long creationTime = 0;
long elapsedTime = 0;
long diff = 0;
private static long getMilis() {
return System.nanoTime()/ 1000000L;
}
public TimerElement(String name) {
creationTime = getMilis();
startTime = creationTime;
lastTime = creationTime;
this.name = name;
}
public void refresh() {
diff =getMilis() - lastTime;
lastTime = getMilis();
elapsedTime = lastTime - startTime;
}
public long getDiff() {
return diff;
}
public long getElapsedTime() {
return elapsedTime;
}
public long getLastTime() {
return lastTime;
}
public String getName() {
return name;
}
public long getStartTime() {
return startTime;
}
public long getStopTime() {
return stopTime;
}
}