2016-09-23 7 views
1

Frage ist ziemlich einfach - Ist die Überprüfung der tatsächlichen Parameter zu einer Funktion eine Leistung Strafe?Tatsächliche Parameterüberprüfung Leistung Auswirkungen

Exportierte Bibliotheksfunktionen sind in der Regel in der Regel durch den Benutzer-Code übergeben aktuellen Parameter überprüfen:

if (arg1 == NULL || arg2 == NULL) 
    return -EINVAL; 

Ist diese Prüfung erheben wir eine Leistungseinbuße? Ich habe versucht, einen Bibliothekscode zu optimieren, indem ich diese Überprüfungen von einigen der exportierten Funktionen entfernte (ich verließ mich darauf, dass ich ein gut erzogener Benutzer war und immer gültige Parameter übergab), aber ich bemerkte keine echte Verbesserung.

Meine erste Schätzung wäre, dass Verzweigungsprognose auf modernen Prozessoren die if-Verzweigung nicht übernehmen und mit dem Code ohne echte Strafe fortfahren wird. Wenn das tatsächlich der Grund ist - wo liegen die Grenzen solcher Verzweigungsvorhersagemechanismen? Gibt es ein Szenario, in dem die Beseitigung dieser Überprüfungen die Leistung verbessern würde? Wie ändert sich das zwischen einer nativen kompilierten Sprache wie C und einer interpretierten oder VM-Sprache wie Python und Java?

BTW - Ich weiß, wie wichtig es ist, Laufzeitparameter zu überprüfen. Ich bin nur am Performance-Aspekt interessiert.

+0

Sie müssen diese Art von Sache weitgehend auswerten, um wirklich zu wissen. Es gibt keine Möglichkeit, dies definitiv zu beantworten. Schauen Sie sich auch die Makros '__likely' und' __unlikely' des Linux-Kernels an. –

+0

Sie könnten [dies] (http://stackoverflow.com/a/11227902/2681632) interessant finden. –

+0

Eine bessere Frage ist, ob das Überprüfen der Argumente für 'NULL' etwas Nützliches macht. Es gibt * reichlich * Nicht-NULL-Zeiger, die nicht an eine Funktion übergeben werden dürfen, die eine gültige Eingabe erwartet. Ein 'assert()' könnte vernünftiger sein. – EOF

Antwort

1

Wenn die Überprüfung von Argumenten so einfach ist wie ein Vergleichswert, ist die Verbesserung der Leistung, die sich aus dem Entfernen dieser Überprüfungen ergibt, minimal. Wenn eine der Überprüfungen komplexer ist, wie das Überprüfen aller Elemente eines Arrays oder das Aufrufen anderer Funktionen, um die Überprüfung jedes Parameters durchzuführen, wird möglicherweise eine Verbesserung der Leistung angezeigt.

In jeder gut geschriebenen Bibliothek sollte diese Art von Parameterüberprüfungen nicht zeitaufwendig sein. Wenn Sie versuchen, den Engpass zu finden, der sich auf Ihre Entwicklung auswirkt, sollten Sie die Ausführung Ihres Codes benchmarken/profilieren, um festzustellen, "welche Codezeile/Funktionen" mehr Zeit für die Ausführung benötigen und sich auf deren Verbesserung konzentrieren.

Verwandte Themen