ΠΡ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π±Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΠΊΠ°Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΊΠ°:
ΠΠΈΡΡΠΈΠ½Π³ 22.2. Π€Π°ΠΉΠ» prog.Ρ
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
ΠΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠΉΡΠ΅ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (gcc -o prog prog.c) ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ strace:
$ strace prog
ΠΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄:
execve("./a.out", ["./Π°.out"], [/* 21 vars */]) = 0
uname((sys="Linux", node="localhost.localdomain", ...}) = 0
brk(0) = 0x80495b4
open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 7
fstat64(7, {st_mode=S_IFREG|0644, st_size=31578, ...}) = 0
old_mmap(NULL, 31578, PROT_READ, MAP_PRIVATE, 7, 0) = 0x40014000
close(7) = 0
open("/lib/i686/libc.so.6", O_RDONLY) =7
read(7, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`u\1Π4\0"..., 1024) = 1024
fstat64(7, {st_mode=S_IFREG|0755, st_size=1401027, ...}) = 0
old_mmap(0x42000000, 1264928, PROT_READ|PROT_EXEC, MAP_PRIVATE, 7, 0) = 0x42000000
mprotect(0x4212c000, 36128, PROT_NONE) = 0
old_mmap(0x4212c000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 7, 0x12c000) = 0x4212c000
old_mmap(0x42131000, 15648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x42131000
close(7) = 0
munmap(0x40014000, 31578) = 0
brk(0) = 0x80495b4
brk(0x80495e4) = 0x80495e4
brk(0x804a000) = 0x804a000
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000
write(1, "Hello\n", 6) =6
munmap(0x40014000, 4096) = 0
_exit(0) = ?
Π§ΠΈΡΠ°ΡΡ Π²ΡΠ·ΠΎΠ²Ρ Π½ΡΠΆΠ½ΠΎ ΡΠ°ΠΊ:
ΠΈΠΌΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° = Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ²Π΅Π»ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΠ·ΠΎΠ² write() Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 6.
Π ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ (ΠΎΠ±ΡΡΠ½ΠΎ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ -1), ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° strace Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ΄, Π½ΠΎ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ:
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π² ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ:
open("file.dat", O_WRONLY|O_APPEND|O_CREAT, 0666) = 3
Π‘ΠΈΠ³Π½Π°Π»Ρ ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
sigsuspend([] <unfinished ...>
--- SIGINT (Interrupt) ---
+++ killed by SIGINT +++
Π‘ΡΡΡΠΊΡΡΡΡ, ΡΠΎΡΠ½Π΅Π΅ ΡΠ»Π΅Π½Ρ ΡΡΡΡΠΊΡΡΡ, Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² ΡΠΈΠ³ΡΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ ΠΈ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΈΠΌΡ_ΡΠ»Π΅Π½Π°=Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) =0
Π‘ΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΡΡΠΎΠΊΠΈ Π² Π‘, ΡΠΎ Π΅ΡΡΡ ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ΅Π½Ρ Π² Π΄Π²ΠΎΠΉΠ½ΡΠ΅ ΠΊΠ°Π²ΡΡΠΊΠΈ:
read(3, "root::0:0:System Administrator:/"..., 1024) = 422
22.5. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. ΠΡΠΎΡΠ°ΠΉΠ»Π΅Ρ gprof
ΠΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ? Π‘ΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΏΡΠΈΡΠΈΠ½Π° ΠΊΡΠΎΠ΅ΡΡΡ Π² Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΌ, ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅. Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² ΡΠ΅Π»ΠΎΠΌ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠ΄Π° Π½Π°Π·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠ°ΠΌΠΈ. Π Π²Π°ΡΠ΅ΠΌ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠΎΠ² gprof, prof, profiler.
Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ gprof (The GNU Profiler), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠ»ΡΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ 22.3.
ΠΠ»ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ gprof Π’Π°Π±Π»ΠΈΡΠ° 22.3
ΠΠ»ΡΡ ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ -Π° He Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ½ΠΊΡΠΈΡΡ -b ΠΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ Π² ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ -Ρ ΠΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΡΠ΅Π»ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π³ΡΠ°ΡΠΈΠΊΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² -e ΠΈΠΌΡ_ΡΡΠ½ΠΊΡΠΈΠΈ ΠΠ° Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΎΡΡΠ΅Ρ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π΅Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ -E ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ -f ΠΈΠΌΡ_ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ± ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π΅Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ -F ΠΈΠΌΡ_ΡΡΠ½ΠΊΡΠΈΠΈ ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½Π΅Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ -k func1 func2 ΠΠ΅ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ func2 ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ func1 -s Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° gmon.sum -z ΠΡΠ²Π΅ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ Π½ΡΠ»Π΅Π²ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ22.5.1. ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠ°
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅ΡΠ° Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠΏΡΠΈΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° -pg ΠΈ Π±Π΅Π· ΠΎΠΏΡΠΈΠΈ -ΠΎ. ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ°ΠΉΠ»ΠΎΠΌ a.out. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ°ΠΉΠ» a.out, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π» ΡΠ°ΠΉΠ» gmon.out. Π’Π΅ΠΏΠ΅ΡΡ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅Ρ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ --nograph:
$ gcc -pg 1.Ρ
$ ./Π°.out
$ gprof -b βno-graph
ΠΠ΅Π· ΠΊΠ»ΡΡΠ° -b ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ:
β¦ Time: Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎΠΌ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΈ;
β¦ cumulative seconds: ΡΡΠΌΠΌΠ° ΡΠΈΡΠ»Π° ΡΠ΅ΠΊΡΠ½Π΄ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΡ Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΉ;
β¦ self seconds: ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΡΠ½Π΄, ΠΏΠΎΡΡΠ°ΡΠ΅Π½Π½ΠΎΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ;
β¦ Calls: ΡΠΈΡΠ»ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ²;
β¦ self ms/calls: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄, Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ;
β¦ total ms/calls: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄, Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ;
β¦ name: ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π ΠΈΡ. 22.5. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° gprof
Π§ΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π»ΠΈΡΡΠΈΠ½Π³ 22.3.
ΠΠΈΡΡΠΈΠ½Π³ 22.3. ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
#include <stdio.h>
int function2() {
int i;
/* Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ */
for (i=0;i<9999999;i++) ;
return 777;
}
double function(void) {
int i;
double x = 7.2323232323, y=324343.3434;
/* Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π·Π°Π΄Π΅ΡΠΆΠΊΡ */
for (i=0;i<9999999;i++) x/y;
function2();
return x/y;
}
int main() {
int i;
double l;
for (i=0;i<10;i++) {
printf("%d\b",i);
l=function();
}
return 0;
}
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π°, ΡΡΠ½ΠΊΡΠΈΡ function() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ 10 ΡΠ°Π· (ΡΠΌ. ΠΏΠΎΠ»Π΅ calls). Π ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ function2(), ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΈΡΠ»ΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΠΆΠ΅ ΡΠ°Π²Π½ΠΎ 10. Π€ΡΠ½ΠΊΡΠΈΡ function() Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ 1.09 ΡΠ΅ΠΊΡΠ½Π΄ (self seconds), Π° ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Π΅ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ (ΠΊΡΠΎΠΌΠ΅ main), ΡΠΎ ΠΏΠΎΠ»Π΅ cumulative seconds ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π²Π½ΠΎ 1.09. Π€ΡΠ½ΠΊΡΠΈΡ function2() ΡΠ°Π±ΠΎΡΠ°Π΅Ρ 1.07 ΡΠ΅ΠΊΡΠ½Π΄, Π½ΠΎ Π΅Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ function(), ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ 1.09 ΡΠ΅ΠΊΡΠ½Π΄. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΠΎΠ»Π΅ cumulative seconds Π΄Π»Ρ Π²ΡΠΎΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π²Π½ΠΎ 1,09+1.07=2.16. ΠΠΎΠ»Π΅ self ms/call ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ ΠΏΠΎΠ»Ρ self seconds, ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ Π²Π΅Π»ΠΈΡΠΈΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π°Ρ . ΠΠΎΠ»Π΅ total ms/call ΠΎΠ±ΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ»Ρ cumulative call ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ΅Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π΅ cumulative call ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ΠΌΡ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π²ΡΠ΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΡ .
22.5.2. ΠΠ°ΠΊ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠ³Ρ Π²Π°ΠΌ ΠΏΠΎΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
1. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΡΠ°ΠΉΠ»Π΅Ρ, ΠΈ ΠΏΡΡΡΡ ΠΎΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΉ.
2. ΠΠ΅ΡΠ΅ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ (ΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ), ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ.
3. ΠΠΎΠ³Π΄Π° Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° ΡΠ·ΡΠΊΠ΅ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°, Π΅ΡΠ»ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΠΈΠ²ΠΎΡΠ΅ΡΠΈΡ ΠΈΠ΄Π΅ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ Ρ ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° Π·Π°ΠΏΡΡΠΊΠ°Π»Π°ΡΡ Π½Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π΅ ΡΠ°Π·Π½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌ β ΡΡΡ Π±Π΅Π· Π‘ Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ). ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»Π° ΠΌΠ°Π»ΠΎ, ΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΡΠΈΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ Π²ΡΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΡ βg) β ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΡΠ°Π½Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΎΠ΄Π½Ρ ΠΈΠ· ΠΎΠΏΡΠΈΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ -O.
ΠΠ»Π°Π²Π° 23
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° GTK+
Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ Linux-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠ°ΠΊ Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π‘ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ GUI Π½Π΅ ΠΏΠΎΡΡΡΠΎΠΈΡΡ, ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΎ ΠΏΡΠΈΠ²ΡΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Windows ΠΎΡΠ΅Π½Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΠ΅Π»Π΅Π½ Π½Π΅ ΠΏΡΠΎΡΡΠΎ ΠΊ Π½Π°Π»ΠΈΡΠΈΡ GUI, Π½ΠΎ ΠΈ ΠΊ Π΄ΠΈΠ·Π°ΠΉΠ½Ρ ΡΠΎΡΠΌΡ (ΠΎΠΊΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ). ΠΠΎΡΡΠΎΠΌΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ Π²Π°ΠΌ Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ. Π‘Π°ΠΌΡΠΌΠΈ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ GUI ΡΠ²Π»ΡΡΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ GTK+ ΠΈ Qt. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠΆΠ΅ Π±ΡΠ΄ΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ (ΡΠΆ GNOME ΠΈ KDE Π΅ΡΡΡ ΠΏΠΎΡΡΠΈ Ρ Π²ΡΠ΅Ρ ). Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ GTK+, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π°, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΠΏΡΠΎΡΠ΅, ΡΠ΅ΠΌ Qt.