Merhaba,
Az önce şöyle ayak üstü bir şey yaptım:
alias ÖLÇ = ZamanSayacı;
struct ZamanSayacı
{
bool ekranaYaz;
StopWatch süre;
import std.datetime.stopwatch;
this(bool print)
{
ekranaYaz = print;
süre = StopWatch(AutoStart.yes);
}
auto dur() => süre.stop;
import std.stdio : writef;
~this()
{
if(ekranaYaz) writef("\n%.6f sn.\n",
süre.peek.total!"nsecs"/1e9);
}
}
Yaptığı gördüğünüz gibi basit, belki daha basiti vardı, bilemem veya zaten kütüphaneden şu şekilde kullanmanız daha kolayınız gidiyordur:
import std.datetime.stopwatch;
import std.stdio;
void main()
{
auto sw = StopWatch(AutoStart.yes);
//...
writefln("\n%.6f sn.", sw.peek.total!"nsecs"/1e9);
}
Yani sw.stop()
bile yapmanıza (eğer ölçtüğünüz kodlar program ile eş zamanlı bitiyorsa) gerek bile yok. Yine aynı mantık, yapıyı şu şekilde kullanmak isteyebileceğimi gördüm çünkü hızlıca tüm programı ölçsün yeter:
import sdb; // bu benim kütüphane içinde package.d ve public import'lar falan var
void main()
{
auto sw = ÖLÇ(true); /* Bu yardımcı ÖLÇme aracı aslında
Stopwatch'ın bir sarması ve nesne oluştuğunda
otomatik start olur ama false ile oluştuğunda
start olsa da ekrana yazmaz! Çünkü destructor
ekranaYaz bool değişkeni ile kontrol edilir.
... kodlar ...*/
sw.dur(); // artık nerde durmasını isterseniz...
}
Özelliği ise şu: Sadece auto sw = ÖLÇ(true);
satırını yaz yeter çünkü, yapı kurulduğu anda otomatik zaman sayacını devreye girer. Zaten o satırdan sonra sizin ölçeceğiniz kodlar başlıyor. Eğer mükemmel ölçüm istiyorsanız sw.dur()
yazarsınız olur biter. Sonuçta süreye göreceksiniz çünkü bu görevi yıkıcı işleve (~this) verdim.
Ehh, bu kadar söze gerek olmayan basit bir çözümdü, işinize yararsa kullanın :)
Dip Not: Bir şey unuttum: Eğer ekran yazmak istemeyip ölçülen değeri kullanmak istiyorsanız sw.süre.peek()
yapıp onu okutursunuz. Tabi kurarken auto sw = ÖLÇ(false);
ile kurmanız ekrana yazmasını engelleyecek. Belki yıkıcıya durdurma işlevini de ekleyebilir! Ama şart değil, ne dersiniz?
SDB@79