TL; DR: foo
profil olayları almak için hızlı ve küçük, 100 kez daha çalıştırın. Sıklık ayarı yazım hatasıyla yapıldı ve pprof
, CONFIG_HZ'den (genellikle 250) daha sık örneklemiyor. Daha modern bir Linux'a geçmek daha iyidir perf
profiler (tutorial from its authors, wikipedia).
Uzun versiyon:
Sizin foo
fonksiyonu sadece çok kısa ve basit - sadece iki işlevi çağırır. çok daha büyük bir şeye ana yılında int a = 1000;
değişen
foo():
.LFB972:
.loc 1 27 0
pushq %rbp
movq %rsp, %rbp
.loc 1 28 0
movl $.LC0, %esi
movl std::cout, %edi
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
movl std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&), %esi
movq %rax, %rdi
call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))
.loc 1 29 0
popq %rbp
ret
.LFE972:
.size foo(), .-foo()
Yani, daha fazla kez için foo
çalışmalıdır profilinde görmek: okunabilir C++ isimleri yapmaya c++filt
programla test.s
filtrelenmesi ile g++ test.cc -lprofiler -o test.s -S -g
ile testi, Derleyen 10000 veya daha iyi 100000 gibi (test için yaptığım gibi).
Ayrıca "CPUPROFILE_FREQUENC=10000
" hatasını düzeltmek için CPUPROFILE_FREQUENCY
numaralı telefonu düzeltin (Y
numaralı telefonu unutmayın). 10000'ün CPUPROFILE_FREQUENCY için çok yüksek bir ayar olduğunu söylemeliyim, çünkü genellikle çekirdek yapılandırması CONFIG_HZ
'a bağlı olarak saniyede 1000 veya 250 olay oluşturabilir (çoğu 3.x çekirdeğin 250'si var, grep CONFIG_HZ= /boot/config*
'u kontrol edin). Ve pprof içinde CPUPROFILE_FREQUENCY için varsayılan ayar 100'dir.
Ubuntu 14 üzerinde bash komut dosyasıyla farklı CPUPROFILE_FREQUENCY: 100000, 10000, 1000, 250 değerlerini test ettim.
for a in 100000 100000 10000 10000 1000 1000 300 300 250 250; do
echo -n "$a ";
CPUPROFILE_FREQUENCY=$a CPUPROFILE=dump$a.txt ./test >/dev/null;
done
04 Ve sonuç CONFIG_HZ set daha tek iş parçacığı saniyede daha fazla etkinlik, yapamaz google-perftools aynı 120-140 olayları ve yaklaşık 0.5 saniye her ./test çalışma zamanı, yani cpuprofiler vardı çekirdeğimde (250 tane var). Orijinal bir = 1000 foo
ve cout fonksiyonlarının ile
100000 PROFILE: interrupts/evictions/bytes = 124/1/6584
100000 PROFILE: interrupts/evictions/bytes = 134/0/7864
10000 PROFILE: interrupts/evictions/bytes = 125/0/7488
10000 PROFILE: interrupts/evictions/bytes = 123/0/6960
1000 PROFILE: interrupts/evictions/bytes = 134/0/6264
1000 PROFILE: interrupts/evictions/bytes = 125/2/7272
300 PROFILE: interrupts/evictions/bytes = 137/2/7984
300 PROFILE: interrupts/evictions/bytes = 126/0/7216
250 PROFILE: interrupts/evictions/bytes = 123/3/6680
250 PROFILE: interrupts/evictions/bytes = 137/2/7352
hiçbir foo
var bu yüzden her vadede üzerlerinde herhangi profilleme olay (hatta 250 etkinlik/s) almak için çok hızlı çalışır, ne de herhangi bir giriş/çıkış fonksiyonları . Küçük miktarlarda, __write_nocancel
örnekleme olayına sahip olabilir ve sonra foo
ve I/O işlevleri libstdC++ şeklinde raporlanır (en üstte olmayan bir yerde, veya google-pprof
seçeneğinin google-pprof
seçeneğini kullanın)
a=100000
ile
....
1 0.9% 99.1% 1 0.9% __write_nocancel
....
0 0.0% 100.0% 1 0.9% _IO_new_file_overflow
0 0.0% 100.0% 1 0.9% _IO_new_file_write
0 0.0% 100.0% 1 0.9% __GI__IO_putc
0 0.0% 100.0% 1 0.9% foo
0 0.0% 100.0% 1 0.9% new_do_write
0 0.0% 100.0% 1 0.9% std::endl
0 0.0% 100.0% 1 0.9% std::ostream::put
, foo hala kendi olayları için çok kısa ve hızlı olduğunu, ancak G/Ç fonksiyonları birkaç var: sıfır olmayan çocuk olay sayılır. Sıfır kendi sayaçları ile
34 24.6% 24.6% 34 24.6% __write_nocancel
1 0.7% 95.7% 35 25.4% __GI__IO_fflush
1 0.7% 96.4% 1 0.7% __GI__IO_putc
1 0.7% 97.8% 2 1.4% std::operator<<
1 0.7% 98.6% 36 26.1% std::ostream::flush
1 0.7% 99.3% 2 1.4% std::ostream::put
0 0.0% 100.0% 34 24.6% _IO_new_file_sync
0 0.0% 100.0% 34 24.6% _IO_new_file_write
0 0.0% 100.0% 40 29.0% foo
0 0.0% 100.0% 34 24.6% new_do_write
0 0.0% 100.0% 2 1.4% std::endl
Fonksiyonlar sadece sayesinde okuma çağrısı zincirleri (çerçeve bilgisi ihmal değilse o örneği aldım işlevlerini çağıran kim bilir) ait pprof
yeteneği görülmektedir: Bu uzun --text
çıkışından grepped listesidir .
Ben de daha modern, daha yetenekli tavsiye edebilir
(hem yazılım ve donanım olaylarını en fazla 5 kHz frekans veya daha fazla; hem kullanıcı alanı ve çekirdek profilleme) ve daha iyi desteklenen profilci Linux perf
profilci (tutorial from its authors, wikipedia) .
perf
den a=10000
ile sonuç yok:
$ perf report |less
... skip some extra info about the machine, kernel, and perf starting command
# Samples: 1K of event 'cycles'
# Event count (approx.): 1155264208
# Overhead Command Shared Object Symbol
41.94% test3 libm-2.19.so [.] __tan_sse2
16.95% test3 libm-2.19.so [.] __sin_sse2
13.40% test3 libm-2.19.so [.] __cos_sse2
4.93% test3 test3 [.] bar()
2.90% test3 libc-2.19.so [.] __GI___libc_write
....
0.20% test3 test3 [.] foo()
:
$ perf record ./test3 >/dev/null
... skip some perf's spam about inaccessibility of kernel symbols
... note the 3 kHz frequency here VVVV
Lowering default frequency rate to 3250.
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.078 MB perf.data (~3386 samples) ]
Ben (varsayılan başlar tarafından interaktif profil tarayıcısını çünkü perf report
) daha az kullanacağız perf.data
çıktı dosyasından metin raporunu görmek için Veya ham olayı (örnek) sayaçlarını görmek için veya perf report -n | less
:
# Overhead Samples Command Shared Object
41.94% 663 test3 libm-2.19.so [.] __tan_sse2
16.95% 268 test3 libm-2.19.so [.] __sin_sse2
13.40% 212 test3 libm-2.19.so [.] __cos_sse2
4.93% 78 test3 test3 [.] bar()
2.90% 62 test3 libc-2.19.so [.] __GI___libc_write
....
0.20% 4 test3 test3 [.] foo()
"CPUPROFILE_FREQUENC = 10000" ifadesini denediniz, ancak bu bir Y eksik, bu yüzden eğer fiili (ve yoksayılırsa) o zaman küçük foo'yu göstermek için yeterli örnekleriniz olmayabilir. – mgkrebbs
CPU saatine bakıyorsunuz, duvar saati değil. CPU zamanı 'foo' kullanım miktarı neredeyse hiçbir şeydir. Tek yaptığı, I/O yapan kütüphane fonksiyonlarıdır ve I/O sırasında CPU örnekleri gerçekleşmez. –