2017-04-03 3 views
2

Kürzlich habe ich die Existenz der "backtrace" Funktion gelernt. Diese Funktion ermöglicht es, unter bestimmten Bedingungen den Aufruf eines ELF-laufenden Programms abzurufen, das ohne Debugging-Informationen kompiliert wurde.Wirkung der Entfernung "statische" Schlüsselwort für die Funktion

Es ist für mich perfekt ist (ich kann nicht das Debuggen Symbol in Produktionsprogramm einfügen), aber für „Backtrace“ zu arbeiten, gibt es (in etwa) zwei Zustand:

  • den Linker Sagen Sie zusätzliche Informationen hinzufügen (durch Übergeben der Option -rdynamic).
  • Konvertieren Sie alle "statische" Funktion in "nicht statische" Funktion.

Meine Sorgen ist, dass, wenn ich diese zwei Bedingung erfüllt, wird mein Programm langsamer sein (weil Compiler nicht nicht-statische Funktion optimieren kann, wie er statische Funktion optimieren?). Soweit ich weiß, hat das Hinzufügen zusätzlicher Informationen mit -rdynamic keinen Einfluss auf die Programmleistung: Es fügt der ELF-Binärdatei nur ein wenig Gewicht hinzu.

Also hier ist meine Frage:

Was ist der Effekt in der Bezeichnung der Leistung ausgeführt wird, wenn alle statische Funktion nicht-statische Funktion werden?

+0

'statisch' betrifft nur scope/visiblity, nein? – ThingyWotsit

+0

Ich habe vergessen, es aufzuschreiben, aber soweit ich weiß, ja, statische Auswirkungen Umfang/Sichtbarkeit. Wo mein Zweifel beginnt ist, wenn 'statisch' NUR Einfluss auf Umfang/Sichtbarkeit hat. Jemand, den ich kenne, könnte die Compiler-Optimierung ebenfalls beeinflussen, aber er kann nicht bestätigen, was er mit der Quelle sagt, und er ist sich auch nicht wirklich sicher. Wenn es zur Kompilierungszeit eine Ausfallzeit gibt, weil der Kompilierer zusätzliche Schritte berechnen muss, um die gleiche Optimierung durchzuführen, stört es mich nicht. Aber wenn es eine Ausfallzeit zur Laufzeit gibt, lohnt es sich darüber nachzudenken. –

+0

Handelt es sich um C oder C++? Möglicherweise verwandt: http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program Wenn ich mich nicht irre, kann "statisch" in C nur für Variablen verwendet werden, nicht für Funktionen ; Was meinst du mit _statc_funktion? – Codor

Antwort

3

Was ist der Effekt in der Bezeichnung der Leistung ausgeführt wird, wenn alle statische Funktion nicht-statische Funktion werden?

Die Antwort ist "einige", denke ich. Sie können nur sicher sein, dass das Leistungsproblem wahrscheinlich darin besteht, die Leistung Ihres Programms mit und ohne statische Funktionen zu messen. Das offensichtlichste, was mir einfällt, ist, dass der Optimierer möglicherweise nicht in der Lage ist, nicht statische Funktionen zu inline zu bringen.

Sie müssen die statischen Funktionen nicht statisch machen, das einzige Problem wird das Fehlen von symbolischen Namen im Backtrace sein.

Allerdings denke ich, dass Sie größere Probleme haben. Von Ihrem Link auf die man-Seite:

Das Auslassen der Frame-Zeiger (wie durch eine von gcc (1) nicht-Null-Optimierung Ebenen vorausgesetzt) ​​kann dazu führen, dass diese Annahmen verletzt werden.

Damit backstrace zuverlässig funktioniert, sieht es so aus, als müssten Sie ohne Optimierung kompilieren. Das wird sicherlich einen großen Einfluss auf die Leistung haben. Ich denke, ich würde ohne es auskommen.

+0

Diese kleine Linie entkam mir das erste Mal ... Ich denke, ich werde alle statischen Schlüsselwort und alle gcc-Optimierung verlassen, und wenn ich zufällig einen richtigen Callstack habe, nun, werde ich glücklich sein. Vielen Dank. –

+0

Das Entfernen mit optimiertem Code ist sowieso irreführend und schmerzhaft. – ThingyWotsit

-1

Was ist der Effekt in Bezug auf die Laufleistung, wenn alle statischen Funktionen zu nicht statischen Funktionen werden?

Ans - Keine

eine statische Funktion bedeutet, dass Funktion nur auf diese Datei nur sichtbar ist, und kann nicht außerhalb dieser Datei aufgerufen werden. h. es hat Dateiumfang.

Statische Funktionen werden normalerweise in großen Programmen verwendet, wenn Sie nicht möchten, dass Ihre Funktionen mit den Funktionen anderer Personen kollidieren. Eine statische Funktion stellt sicher, dass Sie eine Funktion definieren und sie in Ihrer eigenen Datei verwenden können, und eine andere Person kann auch denselben statischen Funktionsnamen in einer anderen Datei definieren.

Wenn Ihr Code nach dem Entfernen des statischen Schlüsselworts kompiliert wird, dann haben Sie nicht zwei Funktionen mit dem gleichen Namen und es funktioniert wie jede normale Funktion.

Es wird keine Laufzeit Strafe haben.

+1

Das ist nicht wahr. 'static' macht die Funktion für den Compiler wesentlich einfacher, was sich auf die Performance auswirken kann. Ob es einen erkennbaren Unterschied gibt oder nicht, hängt vom Anwendungsfall ab. – user694733

5

Ja, Ihre Sorgen sind richtig: Die Deklaration einer Funktion als static bietet einen guten Hinweis für den Compiler, den es in bessere Optimierung verwandeln kann. Wie hoch die Beschleunigung ist, die Sie von static erhalten, hängt jedoch von Ihrer genauen Situation ab. Es gibt also nur die Wahrheit in der Messung (wie immer, wenn es um die Leistung geht).

Der Punkt über die Deklaration einer Funktion als static ist, dass der Compiler definitiv weiß, dass er alle die aufrufenden Sites einer Funktion sieht. Und wenn es sieht, dass die Funktion nur von einem einzigen Ort aus aufgerufen wird, wird es im Allgemeinen immer inline, egal wie lange es ist. Und das Inlining könnte weitere Optimierungspotenziale erschließen. Dies vermeidet den Overhead des Funktionsaufrufs sowohl hinsichtlich der Größe als auch der Geschwindigkeit. In diesem Fall ist static tatsächlich ein stärkerer Hinweis als inline.

Natürlich hängt die Auswirkung auf die Leistung von der Häufigkeit der Aufrufe der static-Funktion ab. Wie gesagt, Sie benötigen eine Messung, um zu beurteilen, wie viel Leistung Sie durch das Schlüsselwort static erhalten.

+1

Aber auch externe Funktionen können in ihren Übersetzungseinheiten eingebunden werden. Der einzige Unterschied zu 'static' besteht darin, dass der Compiler für die externe Funktion immer einen nicht-inline Körper generieren muss, während für die statische Funktion der Körper eventuell nicht notwendig ist (wenn alle Aufrufe inline waren). Wenn es jedoch um Anrufe geht, die von derselben Übersetzungseinheit stammen, "statisch" werden keine zusätzlichen Inlining-Möglichkeiten "entsperrt". Innerhalb dieser Übersetzungseinheit sind diese Möglichkeiten für statische und externe Funktionen identisch. – AnT

+0

@AnT Die zusätzliche nichtlineare Kopie ist genau das Problem: Sie braucht Platz. Wenn Sie eine ausreichend große Funktion haben und sie als "Inline" deklarieren, kann der Compiler entscheiden, Ihren Hinweis zu ignorieren, da die Kosten für das Hinzufügen dieser zweiten Kopie zu groß sind. (Wenn der Compiler erkennt, dass eine zweite Kopie überhaupt nicht benötigt wird, werden die Kosten für das Inlining genau null, wodurch Funktionen inline werden können, was nicht der Fall wäre Inline ohne das Schlüsselwort 'static' Und das Inlining schaltet die weiteren Optimierungen frei. – cmaster

Verwandte Themen