Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

28.06.2012, 22:54

Dein Argument ist schon richtig (für Energeitechnik, Großrechenzentren usw.), passt aber nicht zu deiner Aussage. Du brauchst ja wesendlich mehr Zeit bei prozendualer Entwicklung und somit sind die paar unnötig ausgeführten Befehle wohl mehr als irrelevant :D


Wohl ein Strohmann deinerseits, der dir verziehen sein soll. Die paar unnötig ausgeführten Befehle, die 1/3 des Maschinencodes ausmachen, ja, völlig irrelevant. Oo

Du widersprichst dir.


Und wo? Es ging um die Lesbarkeit des Codes, mit dem hab ich garnicht erst argumentiert.

Ja und da haste den Sinn der Objektorientierung :D


Ja und? Ich nutze sie aber nicht, wenn ich nicht muss, sondern versuche sie zu vermeiden und andere Lösungen zu finden. Was willst du mir jetzt beweisen? Ich hab nie gesagt, dass ich völlig darauf verzichte. Oo
Hab ich bereits im vierten Post dieses Threads erwähnt.

Gerade Zeigersarithmetik ist doch das, was effizientes und sparsames Programmieren ausmacht. Dafür ist es halt aufwendiger.


Das lässt sich pauschal auf keinen Fall so sagen, sondern hängt von dem Problem ab. Es wird für jeden Zeiger noch extra Speicher reserviert soweit ich weiß, nämlich für den Zeiger an sich.

Also du musst deinen Argumentationsstil mal überdenken sorry, aber du widersprichst dir am laufenden Band.
Du hast doch Tipps verlangt und Tipps bekommen, willst Sie aber nicht akzeptieren und argumentierst dann mit Dingen, die damit gar Nichts am Hut haben.


Langsam wirst du ganz schön dreist, ich habe meine Antwort schon längst bekommen, es ging um dynamische Strings und nicht um Tipps wie ich zu programmieren habe, die wollte ich eben NICHT haben, das habe ich aber auch schon im ersten Post erwähnt. Wenn du nicht lesen kannst mein Freund, dann kann ich auch nichts dafür oder wenn andere mit mir das diskutieren anfangen und ihnen dann aus Höfflichkeit antworte, ich habe öfters schon gesagt, dass ich eigentlich keine solche Diskussion will und das man auch einen anderen Thread dafür aufmachen kann, weil es nichts mit dem eigentlichen Thema zutun hat. Aber naja, bist ja nicht der Einzige.

Also zu dem dynamischen String. Dein Speicher kennt keine Datentypen, ein Datentyp ist Nichts anderes als eine Bitleseregel. Hast du ein vorher definiertes Char Array ist das Nciht anderes wie ein Luxus, dass der Compiler prüft, ob du den von dir vorher definierten Speicherplatzbedarf überschreitest. Also ist ein Zeiger auf einen Char auch nichts anderes, als ein dynamischer String und gleichzeitig die speicherplatzsparenste Variante.


Diese Antwort habe ich ebenfalls schon bekommen, du solltest dir die Threads durchlesen bevor du antwortest.
Es wird ja wohl nicht zuviel verlangt sein, sich die ersten 5 bis 10 Posts durchzulesen.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

22

28.06.2012, 22:58

[offtopic]

Zitat

Prozedurale Programmierung, fast reines C, hab ich aber auch schon geschrieben, lies dir bitte meine Posts durch voher durch.


Das war Ironie :)

[/offtopic]

[toTopic]

Zu deinem Problem: wenn du kein OOP benutzen willst/es vermeidest, darfst du aus "ideologischen" Gründen ja eigentlich auch keinen std::string verwenden, oder? Das wäre dann ja eine Klasse :)
Sonst verwendest du eben pointer auf char arrays, löscht das array, erstellst ein neues und setzt den pointer darauf... jedes mal wenn sich die länge des strings ändert. Also quasi genau das was std::string als viel simpleres Gesamtgebilde (man nannte es auch OOP) für dich bietet.
Nimm das bitte nicht als Beleidigung: aber ein bisschen heuchlerisch ist das schon, oder nicht?

[/toTopic]

[offtopic]

Und ich finde es zwar gut wenn man sich für geringeren Stromverbrauch und für die Umwelt usw. einsetzt. Aber selbst 1/3 unnötiger Assembler Befehle werden wohl nicht die Welt retten, fahr 1km weniger Auto am Tag und du hast diesen Energieverbrauch 100 mal wieder raus. Es ist absoluter Schwachsinn dieses Argument zu bringen. Darüber können wir uns Gedanken machen wenn es keine Atromkraftwerke, keine Autos mit Abgasen, Flugzeuge mit Kerosin und sonst noch was mehr gibt.

Zitat

Ich arbeite aber alleine.


Tja aber erstmal ist es trotzdem oft einfacher OOP zu benutzen. Und zum anderen willst du ja vielleicht nicht für immer alleine entwickeln? Ich hab zwar nichts gegen Querdenker, im Gegenteil, aber ich glaube nicht das 99% der Programmierer sich irren können.

Zitat

Wenn ich bald den Rendering Teil meines Programmes fertig habe, kann ich dir gerne etwas zeigen.


Gerne :) wäre mal eine ganz neue Erfahrung.

[/offtopic]

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

28.06.2012, 23:19

Also mich persönlich würde doch sehr interessieren, wo genau du diese 33% überflüssigen Maschinencode beobachtet hast. Ein Minimalbeispiel wäre interessant, zusammen mit dem Assembleroutput und natürlich der Info mit welchen Versionen welcher Compiler du das getestet hast und inwiefern es relevant ist.
Bedenke bitte, dass du, nur weil irgendein Compiler irgendwo irgendwann mal 33% überflüssigen Code erzeugt hat (das glaub ich dir sofort), daraus nicht schließen kannst, dass aktuelle Compiler generell einfach 33% überflüssigen Code erzeugen...

Auch würde mich interessieren, was genau du eigentlich konkret mit dem "weglassen von lokalen Variablen" meinst. Möglicherweise reden wir hier überhaupt schon die längste Zeit aneinader vorbei!? Vielleicht kannst du uns das ja mal anhand eines Beispiels illustrieren?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (28.06.2012, 23:26)


24

28.06.2012, 23:28

Gerne, diesen 33% überflüssen Code habe ich bei dem Entwickler von Cave Story entdeckt, das Programm wird schon seit längerem von der Fan Szene auseinander genommen. Manche haben auch schon gemutmaßt ob der Compiler einfach nur schlecht war aber ich bezweifle es, immerhin hat der gute Mann 5 Jahre an dem Spiel gearbeitet und hat mit absoluter Sicherheit ein hohes Maß an Programmiererfahrung. Laut den Datensegmenten in dem Programm, halte ich es für wahrscheinlich das Microsoft Visual C++ genutzt wurde um das Spiel zu kompilieren.
Ich untersuche auch nochmal gerne ein mit MinGW kompiliertes Programm, einmal mit Optimierungen und einmal ohne.

Ein Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mov ecx, [ebp+0008]
mov [ecx+0078], 00000000
[b]mov edx, [ebp+0008][/b]
mov eax, [edx+0074]
add eax, 01
[b]mov ecx, [ebp+0008][/b]
mov [ecx+0074], eax
jmp 0042B506
[b]mov edx, [ebp+0008][/b]
mov eax, [edx+0078]
add eax, 01
[b]mov ecx, [ebp+0008][/b]
mov [ecx+0078], eax
[b]mov edx, [ebp+0008][/b]
cmp dword ptr [edx+0078], 40


Ich weiß nicht wieviel Ahnung du von Assembler hast.
Ich hab auch schon anderes merkwürdiges Zeug gesehen aber diese Instruktionen kommen extrem oft vor und sind absolut überflüssig. (fett gedruckt)
Optimiert würde das ganze so aussehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
mov ecx, [ebp+0008]
mov [ecx+0078], 00000000
mov eax, [ecx+0074]
inc eax
mov [ecx+0074], eax
jmp 0042B506
mov eax, [ecx+0078]
inc eax
mov [ecx+0078], eax
cmp dword ptr [ecx+0078], 40


Und zum Codebeispiel, ich habe zwar schonmal geschrieben aber hier nochmal:

Anstatt:

Quellcode

1
2
3
4
5
int a;
int b = 10;
a = foo(b);
bool c = foo2(a)
if(c == false)


etc.
Seh ich extrem oft in Codebeispielen und ich persönlich empfinde es als schlechten Stil.

Lieber:

Quellcode

1
if(foo2(foo(10)) == false)


Natürlich nur, wenn die Zwischenergebnisse nicht benötigt werden und die Verschachtelungen nicht extrem kompliziert werden.

Zu deinem Problem: wenn du kein OOP benutzen willst/es vermeidest, darfst du aus "ideologischen" Gründen ja eigentlich auch keinen std::string verwenden, oder? Das wäre dann ja eine Klasse :)
Sonst verwendest du eben pointer auf char arrays, löscht das array, erstellst ein neues und setzt den pointer darauf... jedes mal wenn sich die länge des strings ändert. Also quasi genau das was std::string als viel simpleres Gesamtgebilde (man nannte es auch OOP) für dich bietet.
Nimm das bitte nicht als Beleidigung: aber ein bisschen heuchlerisch ist das schon, oder nicht?


Ich habe nie gesagt, dass ich es aus ideologischen Gründen ablehne, ledeglich, dass es manche aus ideologischen Gründen propangieren. C ist in der Regel schneller als C++ und damit für mich effizienter, wenn dus nicht glaubst kannst du auch gerne danach googeln, es gibt einige Gründe warum dies so ist, deshalb greife ich auf nur auf objektorientierte zu, wenn die Vorteile eindeutig überwiegen, wie es z.B. bei std::string der Fall ist.

Und ich finde es zwar gut wenn man sich für geringeren Stromverbrauch und für die Umwelt usw. einsetzt. Aber selbst 1/3 unnötiger Assembler Befehle werden wohl nicht die Welt retten, fahr 1km weniger Auto am Tag und du hast diesen Energieverbrauch 100 mal wieder raus. Es ist absoluter Schwachsinn dieses Argument zu bringen. Darüber können wir uns Gedanken machen wenn es keine Atromkraftwerke, keine Autos mit Abgasen, Flugzeuge mit Kerosin und sonst noch was mehr gibt.


Ich bitte darum, die Diskussion nicht zu verzerren, das war meine Antwort auf "Wo Leistung im Überfluss ist, kann man keine Verschwenden.".
Es geht mir nicht darum die Welt zu retten, sondern darum, dass es unnötiger Resourcenverbrauch ist und dem kann keiner widersprechen, der sich mit den Fakten auseinander setzt.

Tja aber erstmal ist es trotzdem oft einfacher OOP zu benutzen. Und zum anderen willst du ja vielleicht nicht für immer alleine entwickeln? Ich hab zwar nichts gegen Querdenker, im Gegenteil, aber ich glaube nicht das 99% der Programmierer sich irren können.


Für manche Dinge ist es einfacher, für andere Dinge bevorzuge ich die klassische prozedurale Variante, bisher hatte ich keine Probleme mit diesen sobald ich mich einigermaßen reingearbeitet hatte. Immerhin programmiere ich noch nicht so lange C++.
Und das sich 99% der Menschen einer bestimmten Gruppe nicht irren können, halte ich für ein Gerücht, wäre nicht das erste mal in der Geschichte der Menschheit. ;)
Die meisten meinen es zu wissen, weil sie es so gelernt haben und leider hinterfragen nur wenige es.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »S. P. Gardebiter« (28.06.2012, 23:43)


dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

28.06.2012, 23:37

C ist in der Regel schneller als C++ und damit für mich effizienter [...]

Sry, aber das ist völliger Blödsinn. In erster Linie hängt das natürlich erstmal vom Programmierer ab. Ein guter C Programmierer ist noch lange kein guter C++ Programmierer (wobei ein guter C++ Programmierer meiner Erfahrung nach in der Regel auch ein guter C Programmierer ist). Das nächste Problem ist, dass die Art und Weise wie man gut in C++ programmiert sich von der wie man gut in C programmiert grundsätzlich unterscheidet. Wenn wir aber mal von einem perfekten Programmierer ausgehen, der beide Sprachen perfekt beherrscht, dann gibt es keinen Grund wieso dieser in C++ inhärent langsamer sein sollte, als in C, aber viele Gründe, wieso der gute Programmierer in C++ wesentlich effizienteren Code schreiben kann als in C (allem voran: Templates).

Auch wundert es mich, dass für dich nun plötzlich die Ausführungsgeschwindigkeit das Kriterium für Effizienz ist. Gerade eben war's doch noch der Speicherverbrauch?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

26

28.06.2012, 23:38

C ist in der Regel schneller als C++


Halte ich für ein Gerücht. Hab da auch noch nie wirkliche Fakten zu gesehen.

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

27

28.06.2012, 23:42

C ist in der Regel schneller als C++


Halte ich für ein Gerücht. Hab da auch noch nie wirkliche Fakten zu gesehen.

Ja, das ist leider ein weit verbreiteter Irrglaube. Schnelles Gegenbeispiel: std::sort(). Selbst ein völlig naiver Aufruf von std::sort() wird wesentlich effizienteren Code produzieren, als der beste C Programmierer mit qsort() sich jemals erträumen könnte...

28

28.06.2012, 23:50

@Topic:

Typische Antworten. Es geht hier nicht um die mitgelieferten Bibliotheken, sondern um Code.

"Die Effektivität des Laufzeitverhaltens von Anwendungen, die auf OOP-Techniken basieren, wird seit jeher kontrovers diskutiert. Alexander Chatzigeorgiou von der Universität Makedonien verglich die Laufzeiteffektivität und die Energieeffizienz von typischen Algorithmen (Gauß-Jordan-Algorithmus, Trapez-Integration und QuickSort) von prozeduralen Ansätzen und OOP-Techniken, implementiert als C- und C++-Software. Auf dem verwendeten ARM-Prozessor ergab sich für drei Algorithmen im Mittel eine um 48,41 % bessere Laufzeiteffektivität mit den prozeduralen C-Algorithmusvarianten. Es ergab sich außerdem eine im Mittel um 95,34 % höhere Leistungsaufnahme der C++-Varianten zu den C-Varianten.

[...]

Als Grund für den Unterschied in Effektivität und Energieeffizienz werden in dem Artikel generelle Abstraktions-Leistungseinbußen und die deutlich größere Anzahl von Zugriffen auf den Arbeitsspeicher durch OOP-Techniken genannt."

Gibt noch zig andere Webseiten, die ähnlich schreiben, in diesem Fall war es Wikipedia.

Auch wundert es mich, dass für dich nun plötzlich die Ausführungsgeschwindigkeit das Kriterium für Effizienz ist. Gerade eben war's doch noch der Speicherverbrauch?


Es ist beides natürlich aber manchmal muss man abwägen was wichtiger ist.
Ich hab übrigens den Post editiert, in dem steht meine Antwort.
Im Fall von Spielen wie Mincraft z.B. ist es extrem wichtig, dass die Blocktypen wirklich nur soviel Speicher belegen wie sie sollten, ansonsten wirds bei nicht genügend Arbeitsspeicher haken, weil ständig von der Platte nachgeladen werden muss.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

29

28.06.2012, 23:55

Typische Antworten. Es geht hier nicht um die mitgelieferten Bibliotheken, sondern um Code.


Also wenns um den Code geht versteh ich grad nicht, warum du 2 grundlegend verschiedene Codes (oop vs prozedual) vergleichst !?

Aus deiner Aussage habe ich eher gelesen "Wenn ich den gleichen Code als als C++ kompilier bekomm ich ein langsameres kompilat"

30

29.06.2012, 00:00

Wieso verstehst du das nicht?
C++ = Objektorientiert
C = Prozedural

Es geht auch um die typischen "Stile" die in diesen Sprachen angewendet werden, da mag C++ für viele vielleicht verständlicher sein aber es ist eben langsamer.

Aus deiner Aussage habe ich eher gelesen "Wenn ich den gleichen Code als als C++ kompilier bekomm ich ein langsameres kompilat"


Hm, ich habe mal gelesen, C++ hat einen großen Overhead.
Allerdings weiß ich nicht wo du das rausgelesen hast, ich habe gesagt: "C ist in der Regel schneller als C++", ich weiß zwar, dass C++ Abwärtskompatibel ist, hier geht es allerdings um einen Vergleich zwischen einem reinem C Programm und einem typischen C++ Programm und nicht ein C Programm was einmal als reines C und einmal als C++ kompiliert wird.

Werbeanzeige