2017-01-09 3 views
0

Aufgrund von Leistungsproblemen auf einem Projekt, das ich das folgende Testprogramm gemacht (auch verschiedene Variablen für die Plausibilitätsprüfung verwendet):localtime() nimmt 24-mal mehr als gmtime() Leistungsproblem auf Linux

int main() 
{ 

struct tm *timeinfo; 
time_t rawtime; 
clock_t begin, end, begin1, end1,begin2,end2; 
double time_spent; 

begin = clock(); 

for (int i = 0; i < 1000000; i++){ 
    time (&rawtime); 
    timeinfo = localtime(&rawtime); 
} 

end = clock(); 
time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
printf("Time elapsed using localtime()  : %fs\n", time_spent);  
//-------------------------------- 

begin1 = clock(); 

for (int i = 0; i < 1000000; i++){ 
    time (&rawtime); 
    timeinfo = gmtime(&rawtime); 
} 

end1 = clock(); 
time_spent = (double)(end1 - begin1)/CLOCKS_PER_SEC; 
printf("Time elapsed using gmtime()   : %fs\n", time_spent);   
//-------------------------------- 

begin2 = clock(); 

for (int i = 0; i < 1000000; i++){ 
    time (&rawtime); 
    localtime_r(&rawtime, timeinfo); 
} 

end2 = clock(); 
time_spent = (double)(end2 - begin2)/CLOCKS_PER_SEC; 
printf("Time elapsed using localtime_r() : %fs\n", time_spent); 


return 0; 
} 

Die Ergebnisse ich werde es sehr seltsam, Lokalzeit dauert ~ 24-mal mehr Zeit, die localtime_r() Funktion scheint weniger als Lokalzeit zu nehmen(), aber noch viel mehr als gmtime():

Time elapsed using localtime()  : 0.958033s 
Time elapsed using gmtime()   : 0.038769s 
Time elapsed using localtime_r() : 0.860276s 

ich es kompiliert haben mit gcc 5 sowie 4.x Version habe ich linux Mint (aktualisiert bis heute) und Cen verwendet tOS5. Auch wurde es auf verschiedenen physischen Maschinen getestet und der Leistungsunterschied ist ähnlich.

Warum gibt es so einen (großen) Leistungsunterschied?

+1

_Diese zwei Funktion ist ähnlich _... die Tatsache, dass sie ähnliche Werte nicht zurück, dass die Umsetzung bedeutet das gleiche .... – LPs

+0

ich die Performance-Unterschied bedeutete ähnlich ist, ich habe bearbeitet den Text, um es mehrdeutig zu machen. – miguels

+0

Was ist Ihre Frage? Ich sehe keinen. – immibis

Antwort

3

Wenn Sie diesen Code unter perf record laufen und dann perf report tun, werden Sie feststellen, dass localtime Anrufe getenv("TZ") bei jeder Iteration. Wohingegen gmtime nicht.

Blick in den Quellcode von glibc bestätigt die callgraphs:

gmtime 
    __tz_convert(, 0,) 
     tzset_internal(0, 1) 
mktime 
    __tz_convert(, 1,) 
     tzset_internal(1, 1) 
      getenv("TZ") 

Siehe glibc Quellcode localtime, gmtime und __tz_convert.

perf report:

Samples: 78K of event 'cycles:u', Event count (approx.): 21051445406 
    Children  Self  Samples Command Shared Object  Symbol       ▒ 
+ 99.48%  0.59%   349 test  test    [.] main      ▒ 
+ 99.48%  0.00%    0 test  libc-2.23.so  [.] __libc_start_main   ▒ 
+ 99.48%  0.00%    0 test  test    [.] _start      ▒ 
+ 98.02%  7.07%   4208 test  libc-2.23.so  [.] __tz_convert    ◆ 
- 24.51% 23.87%   20812 test  libc-2.23.so  [.] getenv      ▒ 
    - 23.87% _start                    ▒ 
     __libc_start_main                  ▒ 
     main                     ▒ 
     __tz_convert                   ▒ 
     getenv                     ▒ 
    + 0.64% getenv                    ▒ 
+ 22.41% 12.75%   9877 test  libc-2.23.so  [.] __tzfile_compute   ▒ 
+ 15.49% 15.49%   8025 test  libc-2.23.so  [.] __offtime     ▒ 
+ 12.72%  6.28%   5476 test  libc-2.23.so  [.] __tzfile_read    ▒ 
+ 9.66%  3.54%   3086 test  libc-2.23.so  [.] __tzstring     ▒ 
+ 8.36%  1.40%   1221 test  libc-2.23.so  [.] __strdup     ▒ 
+ 7.68%  3.38%   2946 test  libc-2.23.so  [.] free      ▒ 
+ 5.98%  3.07%   2682 test  libc-2.23.so  [.] malloc      ▒ 
+ 4.96%  0.68%   611 test  libc-2.23.so  [.] __xstat64     ▒ 
+ 4.30%  4.30%   3750 test  libc-2.23.so  [.] _int_free     ▒ 
+ 4.28%  4.28%   3731 test  [kernel.kallsyms] [k] entry_SYSCALL_64   ▒ 
+ 4.08%  4.08%   3564 test  libc-2.23.so  [.] strlen      ▒ 
+ 3.64%  3.64%   3168 test  libc-2.23.so  [.] __memcmp_sse2    ▒ 
+ 2.91%  2.91%   2561 test  libc-2.23.so  [.] _int_malloc     ▒ 
+ 1.25%  1.25%   1094 test  libc-2.23.so  [.] __memcpy_sse2    ▒ 
+ 0.68%  0.68%   587 test  libc-2.23.so  [.] localtime     ▒ 
    0.26%  0.26%   222 test  libc-2.23.so  [.] 0x000000000001f910   ▒ 
    0.18%  0.18%   37 test  test    [.] [email protected]     ▒ 
    0.15%  0.15%   126 test  test    [.] [email protected]    ▒ 
    0.11%  0.11%   23 test  libc-2.23.so  [.] gmtime      ▒ 
    0.01%  0.01%    6 test  [kernel.kallsyms] [k] __irqentry_text_start  ▒ 
    0.00%  0.00%    3 test  ld-2.23.so   [.] _dl_lookup_symbol_x   ▒ 
    0.00%  0.00%    5 test  ld-2.23.so   [.] do_lookup_x     ▒ 
    0.00%  0.00%    2 test  ld-2.23.so   [.] _dl_relocate_object   ▒ 
    0.00%  0.00%    1 test  libc-2.23.so  [.] 0x000000000001f8e8   ▒ 
    0.00%  0.00%    1 test  ld-2.23.so   [.] strlen      ▒ 
    0.00%  0.00%    1 test  ld-2.23.so   [.] _dl_debug_initialize  ▒ 
    0.00%  0.00%    1 test  ld-2.23.so   [.] _dl_start     ▒ 
    0.00%  0.00%    1 test  [kernel.kallsyms] [k] page_fault     ▒ 
    0.00%  0.00%    6 test  ld-2.23.so   [.] _start  
0

Teile der Arbeit von localtime und gmtime sind zwischengespeichert.

Also nur der erste Aufruf einer dieser Funktionen funktioniert wirklich, d. H. Lesen Sie /etc/localtime, um die lokale Zeitzone zu erhalten. Diese Aktion wird auch für gmtime() ausgeführt, auch wenn dies möglicherweise nicht erforderlich ist.

Um zuverlässige Ergebnisse zu erhalten, rufen Sie vor der ersten Messung gmtime oder localtime an. Die Leistung beider Funktionen sollte dann ähnlich sein.

+0

Wie kann das Ergebnis eines Aufrufs einer Zeitfunktion zwischengespeichert werden? Ist der Cache-Eintrag von einer CPU-Tick-Zählung oder einem Summat begleitet? Und nach _n_ Ticks für ungültig erklärt? –

+0

@LightnessRacesinOrbit Teile der Arbeit werden zwischengespeichert, nicht das Ergebnis selbst. Ich habe den irreführenden Begriff korrigiert. – Ctx

+0

Nun, ich werde die Antwort löschen, wenn etwas falsch ist, kein Problem ... Lust, mir zu sagen, was los ist? – Ctx

Verwandte Themen