2016-09-21 2 views
0

Ich habe eine FunktionLeistungsvergleich, wenn Argumente bekannt sind?

enum Limit {MIN, MAX}; 

inline int f(pair<int, int> p, Limit l) 
{ 
    return l == MIN ? p.first : p.second; 
} 

Vergleichen Sie die computatinal Zeit von f(p, MIN) und p.first, ist die erste, langsamer auch mit einem guten Compiler in Release-Version?

+2

So bauen Sie mit Optimierungen aktiviert? Gibt es einen Unterschied, wenn Sie dem Compiler sagen, dass die Funktion 'inline' gemacht werden könnte? Wie wäre es mit 'constexpr'? Und was meinst du mit "langsamer"? Wie hast du gemessen? Was ist der Unterschied? –

+1

Wenn Argumente zur Kompilierzeit bekannt sind, dann ist die Funktion 'constexpr' eine gute Idee. –

+0

Wie messen Sie die Leistung und was ist der Unterschied? f (p, MIN) enthält p.first, also braucht es natürlich mehr Zeit. –

Antwort

1

Fragen der Leistung sind unmöglich durch Vorhersage zu beantworten. Es hängt vollständig davon ab, welche Optimierungen der Compiler machen kann.

In diesem erfundenen Fall:

#include <utility> 

enum Limit {MIN, MAX}; 

inline int f(std::pair<int, int> p, Limit l) 
{ 
    return l == MIN ? p.first : p.second; 
} 

extern void emit(int); 
int main() 
{ 
    auto p = std::make_pair(4, 5); 
    emit(f(p, MIN)); 
    emit(p.first); 
} 

Es gibt keinen Unterschied überhaupt:

main:         # @main 
     pushq %rax 

     movl $4, %edi 
     callq emit(int) 

     movl $4, %edi 
     callq emit(int) 

     xorl %eax, %eax 
     popq %rcx 
     retq 
Verwandte Themen