Auch dieser Code kommt aufs selbe raus
Compiler sind ZIEMLICH gut geworden.
Es gibt kaum Optimierungen im Codestil selbst (microcode) die sich noch auf den fertigen Code auswirken.
mfg CBenni::O
Beleg bitte?
Zum 1: Das was du nennst ist aufwendig. Nicht unbedingt das Datentyp auswählen, mehr das möglichst große vermeiden von lokalen Variablen. Und insbesondere muss ich dabei auch anmerken, das klingt auch nicht nach sehr gut lesbarem Code.
Was auch nicht weiter schlimm ist, denn ich möchte ja Code schreiben, den ich möglichst danach nicht wieder groß anfassen muss damit ich ihn ohne großes Umschreiben wiederverwenden kann. Wenn ich irgendwann mal etwas verbessern muss oder etwas verändern muss, empfiehlt es sich sowieso den Code nochmal ganz neu zu schreiben, da man erfahrungsgemäß sich dann sowieso einen besseren Codingstil angewöhnt hat und etwas mehr weiß.
Ich habe auch kein Problem damit lokale Variablen zu vermeiden, hab es mir gleich von Anfang an angewöhnt und ich brauche auch nicht länger als wenn ich sie benutze und wenn kein Weg daran vorbei führt und es sich nunmal anbietet weil es wesentlich einfacher ist, benutze ich sie ohnehin.
Wenn man mit anderen arbeitet, ist das alles sowieso nochmal eine ganz andere Geschichte, dann einigt man sich auf einen Codingstil aber im Moment arbeite ich alleine und werde es wohl auch weiterhin, also kann es mir völlig egal sein. Deshalb weiß ich auch nicht wo das Problem liegt, außer, dass du mir nicht glaubst, dass ich ohne lokale Variablen auch nicht viel länger brauche.
Zum 2: Zum 3: Es gibt noch andere Wege als Bitshifting? Belege bitte!
Bitte genauer lesen, ich habe geschrieben "mit Sicherheit", ich habe nicht gesagt, dass ich welche kenne. Spontan würde mir da nur div einfallen, aber der Befehl ist sicher langsamer als Bitshift und Modulo, wobei ich nichtmal weiß, ob ein Modulo ohne div möglich ist. Div würde zumindest zwei Fliegen mit einer Klappe schlagen, falls man Zugriff auf beide Variablen brauch, da beide Variablen schonmal in zwei verschiedenen Registern gespeichert sind.
In der Tat wird das die CPU nicht wirklich bremsen, den obersten Teil vom Stack wirste nahezu sicher im L1-Cache haben. Allein schon weil du oft Funktionen aufrufen wirst.
Es geht nicht um den obersten Teil vom Stack, es geht um eine Funktion, bei der bekannterweis folgender Code ausgeführt wird:
|
Quellcode
|
1
2
|
push ebp
mov ebp, esp
|
Wenn der Basepointer nun zig mal in verschiedene Register gespeichert wird, ist es immernoch Verschwendung, egal wie gering sie auch sein mag. Und letztendlich sind es nur Mutmaßungen die hier geäussert werden, Fakt ist aber das die Verschwendung nicht von der Hand zu weisen ist.
Ich muss zugeben, von den ganzen hardcore Optimierungen habe ich relativ wenig Ahnung - wozu auch, die braucht man heute eh fast nie. Aber ich weiß, dass die Hersteller da Ahnung von haben und wenn die sagen, Alignment lohnt sich, dann wird das auch fast immer so sein. Und wenn man es verhindert, wird man fast immer Nachteile haben.
Die vergisst aber auch, dass die Hersteller unbedingt ihr Zeug verkaufen wollen oder glaubst du alles aus der Werbung? Gibt so einige CPUs die vom Hersteller hoch angepriesen sind dann aber im Benchmark Test plötzlich nicht mehr so gut abschneiden.
Naja, dann wird halt dann optimiert. Aber es ist doch so: Wieso sollte ich ein halbes Jahr Arbeit darein stecken, meine Engine 10% schneller zu machen, wenn in einem halben Jahr die Durchschnittliche Hardware 15% schneller ist? Wovon die hochoptimierte Version allerdings wenig hat, da die alten Optimierungen auf der neuen Hardware nicht mehr greifen.
Es macht aber nichts sich im Vorfeld darum schonmal Gedanken zu machen und es gibt auch Optimierungen die auf jeder Hardware laufen und nicht nur speziell für eine Hardware gemacht werden müssen.
Aber ist das wirklich ein Problem? Es ist ja nicht so, dass man die alte Hardware jetzt um ein vielfaches billiger bauen könnte. Und die Preise für Bürotaugliche PCs fallen kontinuierlich. Wo Leistung im Überfluss ist, kann man keine Verschwenden.
Du vergisst aber dass Herstellung, Vertrieb und vorallem auch Betrieb Unmengen an Energie fressen. Alte Hardware braucht kommt oft mit wesentlich weniger aus. Und Leistung ist eben nicht im Überfluss vorhanden, wir haben heutzutage ziemliche Probleme was Energie anbelangt. (Stichwort: Atomkraft)
Guck dir mal an, wie das digitale Verbindungen wie HDMI etc. machen, da wird aus "Urheberrechtlichen Gründen" tausende Signale verschlüsselt, entschüsselt, verschlüsselt, entschlüsselt, verschlüsselt und so weiter. Wenn du da noch Adapter ranklatscht, dann ist der übermäßige Stromverbrauch perfekt, alles zur Last der Verbraucher.
Was für ein Array? In ebp wird die Adresse des Stacks gespeichert. Mit [ebp+0008] lässt sich sparsam eine Stelle auf dem Stack ansprechen. Würde man absolute Adressen nutzen, wären die Maschinenbefehle länger. Und den Stack verwendet man für Funktionsparameter (Je nach Aufrufkonvention erst wenn es zu viele sind). Hinterher muss man dafür sorgen das der Stack wieder vor die Parameter zeigt. Das tut man in Assembler nicht anders. Du könntest natürlich auf Funktionen verzichten. Damit bläst du aber deine Executable auf, was du ja auch nicht willst.
[ebp+0008] zeigt auf die erste Variable im struct Array, die besagten Funktionen, von denen ich schon die ganze Zeit rede sind ziemlich schlecht optimiert.
Du verstehst nicht was ich meine, ich rede z.B. von folgendem Code:
mov eax, [ebp+0008]
mov ecx, [eax+000C]
add ecx, 00002000
mov edx, [ebp+0008]
mov [edx+000C], ecx
Die zweite Fett markierte Instruktion ist völlig überflüssig, selbst wenn der Prozessor diese parallel ausführen könnte, willst du mir doch nicht ernsthaft erzählen, dass sich daraus irgendein Nutzen ergibt außer Strom zu verbrauchen? Da gibts auch noch wesentlich bessere Kracher:
mov edx, [ebp+0008]
mov eax, [edx+0078]
add eax, 01
mov ecx, [ebp+0008]
mov [ecx+0078], eax
mov edx, [ebp+0008]
cmp dword ptr [edx+0078], 08
Und das sind noch nette Beispiele, da gibts noch viel schlimmeres Zeug, wenn man das alles entfernen würde und per Hand noch einige Optimierungen vornehmen würde, würde die exe Datei wesentlich kleiner werden und das Programm schneller laufen.
Warum willst du eingendlich keine Pointer benutzen? Das ist doch genau der Sinn davon.
Weil sie umständlich zu benutzen sind und es mit vorgefertigten Klassen in C++ zumindest tausend mal einfacher geht.
Mal davon abgesehn hat Objektorientierung doch so gravierende Vorteile, dass ich deine Verbohrtheit in prozenduale Programmierung überhaupt nicht verstehen kann. Komme selbst aus dem Mikrocontrollerbereich und bin nur zu froh Assembler und C nicht mehr sehen zu müssen. Beim DSP würd ichs verstehn aber warum beim PC?
Wieso Verbohrtheit? Ich benutze objektorintierte Programmierung nicht, wo ich sie nicht benötige, wo ist das Problem? Nur weil du es einfacher findest mit Klassen und Objekten zu arbeiten, heißt das nicht, dass ich es genauso sehe. Und ich kenne beide Seiten, habe ich aber auch schonmal geschrieben. Aber es ist schön wieviele hier meinen Wunsch, den ich zu Anfang des Threads gestellt hatte, nämlich nicht in eine Offtopic Diskussion zu entgleiten respektiert haben.
Und übrigens:
http://de.wikipedia.org/wiki/Objektorien…Grenzen_der_OOP
Ohne Klassen? Wenige/keine lokalen Variablen? Rein modulare Programmierung?
Prozedurale Programmierung, fast reines C, hab ich aber auch schon geschrieben, lies dir bitte meine Posts durch voher durch.
Wenn dieser ganze Kram so ineffizient und langsam ist, warum wurde er dann erfunden?
Weil Leute irgendwann Probleme hatten, bei riesigen Projekten noch die Übersicht zu behalten und die Effizienz aller Teammitglieder sicher zu stellen. Ich arbeite aber alleine.
Ich glaube du machst dir zu viele Gedanken über Dinge die heute nicht mehr von Bedeutung sind. Gerade Speicherverbrauch ist nahezu Wurst. Auch 100MB RAM jucken kaum noch jemanden in Zeiten in denen 4GB RAM Untergrenze sind.
Diese Dinge sind immernoch von Bedeutung, zumindest für mich, es ist schade, dass nicht mehr auf Resourcen geachtet wird, diese Zeiten werden aber irgendwann vorbei sein und das wird auch nicht mehr lange auf sich warten lassen.
Ich würde gerne mal Code von dir sehen, nicht nur irgendwas aus dem Kontext gegriffenes, sondern vielleicht eine cpp Datei. Irgendwas wo du glaubst ernsthaft Resourcen und Performance gespart zu haben. Viel schreiben kann ich nicht, da ich mich nicht mit der Architektur von heute auskenne (ich kenne z.B. den 6502), aber das meiste wurde ja schon gesagt.
Gerne, allerdings spare ich nur "von Grund auf", größere Optimierungen habe ich bis jetzt noch an keinem Programm vorgenommen, da ich einfach zu oft "umgestiegen" bin und "neugeschrieben" habe, wenn mir etwas nicht gepasst hat. Schlussendlich bin ich aber doch bei C++ gelandet, wenn ich es vor 2 Jahren vielleicht noch nicht geglaubt habe. Wenn ich bald den Rendering Teil meines Programmes fertig habe, kann ich dir gerne etwas zeigen.