dmd'nin -profile seçeneği, programın kullandığı zaman hakkında bilgi veriyor.
Öncelikle, programı derlerken -profile seçeneği belirtiliyor:
dmd -profile -w deneme.d
Öyle yapınca, derleyici program kodları arasına zamanını nerede harcadığını gösteren kodlar da ekliyor. Ondan sonra yapılması gereken tek şey, programı çalıştırmak:
/deneme
Program normal olarak çalıştıktan sonra trace.log ve trace.def isminde iki dosya oluşturuyor. Bunlardan trace.log'u açarsanız, içinde iki tür bilgi bulunuyor:
-
her işlev kimin tarafından çağrılıyor, ve kimi çağırıyor
-
her işlevde ne kadar zaman harcanıyor
Programı istediğiniz kadar çalıştırabiliyorsunuz. trace dosyaları, bütün çalıştırmaların toplam bilgisini tutuyorlar.
Örnek:
import std.stdio;
void main()
{
anaİşlev();
}
void anaİşlev()
{
foreach (i; 0 .. 10) {
altİşlev();
}
}
void altİşlev()
{
writeln("merhaba dünya");
}
O programı -profile ile derleyip çalıştırınca oluşan trace.log dosyasının baş tarafında şöyle bilgilre var (işlev isimleri korkunç! :) ):
------------------
_Dmain 0 391108 296
1 _D6deneme10anaİşlevFZv
------------------
10 _D6deneme10anaİşlevFZv
_D6deneme10altİşlevFZv 10 387539 12450
10 _D3std5stdio16__T7writelnTAyaZ7writelnFAyaZv
------------------
1 _Dmain <-- bunu çağıran işlev(ler)
_D6deneme10anaİşlevFZv 1 390812 3273 <-- hakkında bilgi verilen işlev
10 _D6deneme10altİşlevFZv <-- bunun çağırdığı işlev(ler)
------------------
[... gerisini kırptım ...]
Yukarıdaki bölümlerde, hangi işlev hakkında bilgi veriliyorsa, o işlev en sola dayalı olarak gösteriliyor. Onun üstünde ve girintili olarak yazılan işlevler, onu çağıran işlevler... Altında ve girintili yazılanlar da onun çağırdığı işlevler...
Yani yukarıdaki son bölümden anlaşıldığına göre, deneme.anaİşlev işlevini tek bir işlev çağırıyor: main... deneme.anaİşlev'in çağırdığı da tek bir işlev var: deneme.altİşlev...
Dosyanın son tarafındaki bilgiler de şöyle (satırlar uzun olduğu için sağ taraflarını kırptım):
======== Timer Is 3579545 Ticks/Sec, Times are in Microsecs ========
Num Tree Func Per
Calls Time Time Call
10 54961 54961 5496 _D3std5stdio4File17LockingText...
10 26557 26557 2655 _D3std5stdio4File17LockingText...
10 104065 10930 1093 _D3std5stdio4File16__T5writeTA...
20 4517 4219 210 _D3std6format65__T19writeUpToF...
10 66576 3804 380 _D3std6format60__T14formattedW...
10 108264 3478 347 _D6deneme10altİşlevFZv
10 2509 2509 250 _D3std6format10FormatInfo14__T...
1 109179 914 914 _D6deneme10anaİşlevFZv
10 55745 783 78 _D3std6format57__T13formatGene...
10 104786 721 72 _D3std5stdio16__T7writelnTAyaZ...
20 297 297 14 _D3std5stdio4File17LockingText...
1 109261 82 82 _Dmain
10 0 0 0 _D3std5array13__T5emptyTxaZ5em...
10 0 0 0 _D3std4conv15__T2toTAxaTAxaZ2t...
Başlık satırında iki bilgi var:
-
Ticks/sec: saniyede kaç kere örnekleyebildiği
-
Microsecs: zamanlar mikro saniye düzeyinde
Sonra beş sütun halinde şu bilgiler geliyor:
-
Num Calls: işlevin kaç kere çağrıldığı
-
Tree Time: bu işlevin ve onun çağırdığı işlevlerin harcadıkları zaman
-
Func Time: tam bu işlev içinde harcanan zaman (bunun çağırdıkları hariç)
-
Pre Call: çağrı başına harcanan zaman; yani (Func Time) / (Num Calls)
Bu bilgileri şu sayfadan aldım:
http://www.digitalmars.com/ctg/trace.html
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]