title image


Smiley Re: Steigern static-Variablen in Funkt. die Performance?
Das Ganze macht geschwindigkeitsmäßig praktisch keinen Sinn.



Der Zweck von static ist nicht die Geschwindigkeitssteigerung, sondern ein Typ Variable zur Verfügung zu stellen, der bei jedem neuen Aufruf einer Funktion seinen Wert behält. Die Gültigkeitsdauer einer static-Variablen ist also der einer globalen Variablen. Gleichzeitig ist aber eine static-Variable - anders als eine globale Variable - nur innerhalb einer Funktion bekannt.



Mit der Benennung einer lokalen Variablen als static sind also keinerlei Anweisungen an den Compiler verbunden, wie er den Code zu übersetzen hat. Schon von daher sind Überlegungen, bei einer static-Variablen laufe das Programm schneller, eher Spekulation.



Jedem Compiler ist es überlassen, wie er den Quellcode in Maschinencode umsetzt. Auch von daher sind Überlegungen zur Programmbeschleunigung mittels static nicht zwingend.



In der Praxis wird es kaum einen Unterschied machen, ob man eine lokale Variable als static anlegt oder auf dem stack. Im ersten Fall (static) wird der Speicherplatz für die Variable bereits im Maschinencode angelegt. Aber auch im zweiten Fall sind üblicherweise keine zusätzlichen Befehle für Anlegen und Beseitigen einer automatischen Variablen nötig. Vielmehr wird beim Compilieren bereits festgelegt, wo auf dem stack eine lokale Variable ihren Platz haben wird, wenn die Funktion einmal ausgeführt wird. Also kein eigener Maschinenbefehl dafür: ihr Platz wird einfach freigehalten. Und die lokale Variable wird auch nicht beseitigt, sondern nach Beenden der Funktion wird ihr Speicherplatz auf dem stack einfach frei, ohne einen zusätzlichen Maschinenbefehl.



Von der Zahl der Maschinenbefehle bringt also die static-Erklärung nichts.



Die Funktionsausführung kann vor allem dadurch beschleunigt werden, daß eine lokale Variable statt im Speicher (egal ob statischer Speicher, Heap oder stack) in einem Register des Prozessors selbst untergebracht wird. Eine Addition ist z. B. wesentlich schneller, wenn sie innerhalb das Prozessors ausgeführt wird!



Um dies zu erreichen, stehen zwei Möglichkeiten zur Verfügung:



Einmal wird die lokale Variable als register erklärt. Dies ist ein Hinweis des Programmierers an den Compiler, daß die Variable möglichst in einem Prozessorregister (anstatt auf dem Speicher) untergebracht werden soll. Der Compiler ist aber nicht verpflichtet, dies so zu implementieren; er kann eine register-Variable trotzdem auf dem stack unterbringen.



Die sicherste Methode ist aber, eigenen Assemblercode innerhalb einer Funktion einzusetzen. Dann kann man die Variable zuverlässig in einem passenden Regsiter unterbringen. Viele professionelle Programme werden so geschrieben: das Programm wird normal in C oder C++ codiert und zeitkritische Routinen werden durch Assemblercode ersetzt.



Ich habe mir einmal angesehen, wie einige Compiler lokale Variable behandeln, und habe dabei die unterschiedlichsten Machinencodes erhalten. (Fall: eine Funktion mit nur einer einzigen lokalen Variablen.) Dabei haben werden gcc noch Visual C++ auf die register-Anweisung reagiert, sondern die lokale Variable einer Funktion auf dem stack plaziert. Anders dagegen Borland: bereits ohne register-Anweisung wurde die lokale Variable im Prozessor selbst angelegt, nämlich im Register ECX. Also wäre der Borland-Code schneller als der Code der beiden anderen Compiler bei der Funktionsausführung gewesen.



Noch schneller aber wäre eigener Assemblercode gewesen, weil man die Registerbelegung geschickter als Borland hätte machen können (das Register EAX wäre das beste Register für die Variable gewesen).











geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: