This is an old revision of the document!
Operation | Time (ns) | Notes |
---|---|---|
L1 cache reference | 0.5 ns | |
Branch mispredict | 5 ns | |
L2 cache reference | 7 ns | 14x L1 cache |
Mutex lock/unlock | 25 ns | |
Main memory reference | 100 ns | 20x L2 cache, 200x L1 cache |
Compress 1K bytes with Zippy | 3,000 ns | |
Send 1K bytes over 1 Gbps network | 10,000 ns | 0.01 ms |
Read 4K randomly from SSD* | 150,000 ns | 0.15 ms |
Read 1 MB sequentially from memory | 250,000 ns | 0.25 ms |
Round trip within same datacenter | 500,000 ns | 0.5 ms |
Read 1 MB sequentially from SSD* | 1,000,000 ns | 1 ms, 4x memory |
Disk seek | 10,000,000 ns | 10 ms, 20x datacenter roundtrip |
Read 1 MB sequentially from disk | 20,000,000 ns | 20 ms, 80x memory, 20x SSD |
Send packet Caracal - NY - Caracal | 150,000,000 ns | 150 ms |
Un profiler este un utilitar de analiză a performanței care ajută programatorul să determine punctele critice – bottleneck – ale unui program. Acest lucru se realizează prin investigarea comportamentului programului, evaluarea consumului de memorie și relația dintre modulele acestuia.
Suportul pentru profilere este disponibil la nivel de:
Două moduri prin care se realizează profiling-ul sunt prezentate în continuare:
Profiler-ele bazate pe această tehnică necesită de obicei modificări în codul programului: se inserează secțiuni de cod la începutul și sfârșitul funcției ce se dorește analizată. De asemenea, se rețin și funcțiile apelate. Astfel, se poate estima timpul total al apelului în sine cât și al apelurilor de subfuncții. Dezavantajul major al acestor profilere este legat de modificarea codului: în funcții de dimensiune scăzută și des apelate, acest overhead poate duce la o interpretare greșită a rezultatelor.