AMD optron 6270 컴퓨터에서 코드를 실행하고 있습니다. OS는 CentOS 6.2 릴리스입니다. gprof의와 현재 Oprofile이 코드를 profinling 동안 나는동일한 코드에 대해 Oprofile 및 gprof 출력이 다릅니다.
#include<stdio.h>
#include<stdlib.h>
int calling (long a);
int calling1 (long a);
int calling2 (long a);
int calling3 (long a);
int calling4 (long a);
int calling5 (long a);
void main()
{
long a,b=0;
printf("hi");
for (a=0; a<10000000; a++) b++;
b =Calling(a);
b =Calling5(a);
b =Calling4(a);
}
int Calling(long a)
{
long b=0;
for (a=0; a<100; a++) b = Calling1(a);
return 0;
}
int Calling1(long a)
{
long b=0;
for (a=0; a<10000000; a++) b++;
b =Calling2(a);
return 0;
}
int Calling2(long a)
{
long b=0;
for (a=0;a<10000000;a++) b++;
b =Calling3(a);
return 0;
}
int Calling3(long a)
{
long b=0;
for (a=0;a<10000000;a++) b++;
b =Calling4(a);
return 0;
}
int Calling4(long a)
{
long b=0;
for (a=0; a<10000000; a++) b++;
return 0;
}
int Calling5(long a)
{
long b=0;
for (a=0; a<10000000; a++) b++;
b=0;
for (a=0; a<10000000; a++) b++;
b=0;
for (a=0 ;a<10000000; a++) b++;
b=0;
for (a=0; a<10000000; a++) b++;
b=0;
return 0;
}
로 간단한 프로그램을 만들었습니다. 다른보고가있어. gprof를 사용하여 main.exe를 두 번 실행한다고 가정 해 보겠습니다. gprof로 첫 번째 보고서 평면 프로필 :
각 샘플은 0.01 초로 계산됩니다. gprof의와
% cumulative self self total
time seconds seconds calls s/call s/call name
24.80 2.96 2.96 101 0.03 0.03 Calling4
24.71 5.91 2.95 100 0.03 0.12 Calling1
24.63 8.84 2.94 100 0.03 0.06 Calling3
23.78 11.68 2.84 100 0.03 0.09 Calling2
1.01 11.80 0.12 1 0.12 0.12 Calling5
0.34 11.84 0.04 main
0.00 11.84 0.00 1 0.00 11.65 Calling
2 차 보고서
플랫 프로필 : 0.01 초와 같은
각 샘플 계산됩니다.
% 누적자가 자기 총
시간 초 초 통화의/콜 S/호출 이름
25.13 2.99 2.99 100 0.03 0.12 Calling1
24.88 5.95 2.96 101 0.03 0.03 Calling4
24.80 8.89 2.95 100 0.03 0.06 Calling3
23.48 11.69 2.79 100 0.03 0.09 Calling2
1.02 11.81 0.12 1 0.12 0.12 Calling5
0.17 11.83 0.02 main
0.00 11.83 0.00 1 0.00 11.66 Calling
는 모두 보고서는 다르다. 매번 main.exe를 실행할 때마다 프로파일 링 보고서가 달라집니다. Oprofile을 시도했을 때 다음과 같은 다른 결과가 나타납니다.
Oprofile report1 /var/lib/oprofile/samples /를 샘플 디렉토리로 사용. 경고 :/no-vmlinux를 찾을 수 없습니다. CPU : AMD64의 family15h 속도 2.2E + 06 MHz의 (예상) × 00 (단위 없음 마스크)의 단위 마스크 카운트 된 CPU_CLK_UNHALTED 이벤트 (CPU의 클럭이 중지됨 생략) 100,000
samples % image name symbol name
92552 24.7672 main Calling4
91610 24.5151 main Calling3
91566 24.5033 main Calling1
91469 24.4774 main Calling2
3665 0.9808 main Calling5
1892 0.5063 no-vmlinux /no-vmlinux
916 0.2451 main main
10 0.0027 libc-2.12.so profil_counter
1 2.7e-04 ld-2.12.so _dl_cache_libcmp
1 2.7e-04 ld-2.12.so _dl_relocate_object
1 2.7e-04 ld-2.12.so _dl_sysdep_start
1 2.7e-04 ld-2.12.so strcmp
1 2.7e-04 libc-2.12.so __libc_fini
1 2.7e-04 libc-2.12.so _dl_addr
1 2.7e-04 libc-2.12.so _int_malloc
1 2.7e-04 libc-2.12.so exit
현재 Oprofile를 카운트
을 report2/var/lib/oprofile/samples /를 샘플 디렉토리로 사용합니다. 경고 :/no-vmlinux를 찾을 수 없습니다. CPU : AMD64의 family15h 속도 2.2E + 06 MHz의 (예상) × 00 (단위 없음 마스크)의 단위 마스크 카운트 된 CPU_CLK_UNHALTED 이벤트 (CPU의 클럭이 중지됨 생략) 카운트 100,000
샘플 % 화상 이름 심볼 이름
92254 24.7719 main Calling4
91482 24.5646 main Calling1
91480 24.5641 main Calling3
91340 24.5265 main Calling2
3658 0.9822 main Calling5
1270 0.3410 no-vmlinux /no-vmlinux
916 0.2460 main main
6 0.0016 libc-2.12.so profil_counter
1 2.7e-04 ld-2.12.so _dl_lookup_symbol_x
1 2.7e-04 ld-2.12.so _dl_setup_hash
1 2.7e-04 ld-2.12.so _dl_sysdep_start
1 2.7e-04 ld-2.12.so bcmp
1 2.7e-04 libc-2.12.so __mcount_internal
1 2.7e-04 libc-2.12.so _dl_addr
1 2.7e-04 libc-2.12.so _int_free
1 2.7e-04 libc-2.12.so mcount
왜 이런 일이 일어날 수 있습니까? 이럴 수있는 원인은 무엇입니까? 어떻게이 상황을 피할 수있어 지속적인 프로파일 링 결과를 얻을 수 있습니까?
이것은 확률 론적 과정입니다. 측정치가 정확하게 반복 될 수 있다면 버그 일 것입니다. 큰 그림을보세요. –
OS는 테스트 중에 다른 프로세스, I/O 등으로 가득 차 있습니다. 테스트 중 시스템 상태가 후속 테스트 중 상태와 일치 함을 보장하는 것은 불가능합니다. 시스템을 단일 사용자 모드로 설정하면 타이밍이 달라질 수 있습니다. – suspectus
정확한 결과를 얻을 수있는 방법이 있습니까? 그래서 만약 내가 작은 최적화 (5ms)를하고 있다면 보고서에서 볼 수 있어야합니다. –