Jammer-Thread

Hier kann über allgemeine Themen diskutiert werden, die sonst in kein Forum passen.
Insbesondere über Szene, Games, Kultur, Weltgeschehen, Persönliches, Recht, Hard- und Software.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Der Visual C++-x86-Optimizer löst beim Inlining Shifts nur mit 32-Bit-Zahlen auf, und wenn ein eigentlich statisches ?: drin vorkommt überhaupt nicht

Meine „statischen“ Hash-Tabellen brauchen fast 20 KiB Initialisierungstext statt … 0

Der einzige 64-Bit-Shift, der optimiert wird, ist der um 32 Bits

D.h. man muss die oberen und die unteren vier Bytes manuell ausrechnen und dann per (upper << 32) | lower; zusammenfassen, damit es klappt

Bild
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Ich hatte Hashes als int hingehackt. Nun ist der ganze Kram ausgereift und kollisionsfrei, und darum ersetze ich die ints durch eine Klasse Identifier, die direkt im K’tor einen String erwartet.

Und jetzt habe ich einen riesigen Haufen Arbeit, weil alle ints zuvor mit 0 initialisiert wurden und der Compiler diese ganzen Nullen als Nullzeiger versteht und als String an den K’tor übergibt.

Mal ehrlich: Wie viel würde kaputtgehen, wenn dieser ganze „0 ist auch ein Nullzeiger“-Scheiß rausgeschmissen würde? Da müsste doch echt niemand seinen/ihren Arsch bewegen, wenn das Ganze direkt mit einem #define nullptr NULL in <cstring> ausgeliefert würde … und dafür wäre die C-Altlast getötet, die wahrscheinlich das fieseste Verhältnis von Größe (ein Buchstabe) zu Zerstörungspotential (alles ins Nirvana schießen) hat …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Aramis »

Kannst du nicht ueber einen Templatekonstruktor mit Spezialisierung fuer const char* und int die 0-zu-Null-Pointer Konversion abfangen? Die ist ja kontextabhaengig, der Compiler fuehrt sie nur bei einer Zuweisung zu einem Pointer-Typ und beim direkten Aufruf einer Funktion mit einem Pointer-Parameter durch.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Müsste auch ohne Template gehen, oder? Den K’tor einfach nochmal für int überladen. Aber ich will ja alle Stellen als Compiler-Fehler aufgelistet kriegen, wo das passiert. (Mittlerweile bin ich von Hand durch.)

Die Find All References- und View Call Hierarchy-Funktionen sind übrigens das Sinnloseste, was es gibt. Ich sehe bei Ersterem keinen Unterschied zu Seach in All Files (außer, dass es hundertmal lansamer ist) und Zweites wird in einem billigen 10k-Zeilen-Projekt trotz zwei voll ausgelasteten i7-Threads nie fertig …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Jammer-Thread

Beitrag von Chromanoid »

Versuchs mal mit Eclipse oder Netbeans. Eclipse schafft recht locker Projekte mit mehr als 4000 .java Dateien.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

Krishty hat geschrieben:Die Find All References- und View Call Hierarchy-Funktionen sind übrigens das Sinnloseste, was es gibt. Ich sehe bei Ersterem keinen Unterschied zu Seach in All Files (außer, dass es hundertmal lansamer ist) und Zweites wird in einem billigen 10k-Zeilen-Projekt trotz zwei voll ausgelasteten i7-Threads nie fertig …
  1. Find All References ist schneller als Search in All Files.
  2. Was passiert, wenn du Find All References machst und dann im Kontextmenü Resolve Results anwählst?
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Chromanoid hat geschrieben:Versuchs mal mit Eclipse oder Netbeans. Eclipse schafft recht locker Projekte mit mehr als 4000 .java Dateien.
Was auch unheimlich aussagekräftig ist – wir wissen ja, dass Java gerade im Hinblick auf seine endlosen Möglichkeiten der Metaprogrammierung und durch die hunderten Header, die am Anfang jeder Datei eingebunden werden, deutlich komplexer zu interpretieren und zu verwalten ist als C++.
eXile hat geschrieben:
Krishty hat geschrieben:Die Find All References- und View Call Hierarchy-Funktionen sind übrigens das Sinnloseste, was es gibt. Ich sehe bei Ersterem keinen Unterschied zu Seach in All Files (außer, dass es hundertmal lansamer ist) und Zweites wird in einem billigen 10k-Zeilen-Projekt trotz zwei voll ausgelasteten i7-Threads nie fertig …
  1. Find All References ist schneller als Search in All Files.
  2. Was passiert, wenn du Find All References machst und dann im Kontextmenü Resolve Results anwählst?
Zu 1.: Wat
Okay, bei der ersten Ausführung kann SiAF ein bisschen dauern. Danach sind es aber wirklich nur Hundertstelsekunden, während FAR jedes Mal zwei Sekunden lädt.

2. Ich sage es dir, wenn er fertig ist – hat sich, genau wie die Call Hierarchy, bei 55 % festgefahren. Allerdings mit einem statt zwei Threads. Die Call Hierarchy ist btw nach einer Stunde doch noch fertig geworden und hat dann „no results“ ausgespuckt. Spuckt auch nur die Hälfte aus – wenn die Referenzen auf einen K’tor gesucht werden, werden keine Aufrufe durch Initialisierungslisten gefunden sondern nur der Bezeichner der Klasse gefolgt von einer passenden Parameterliste m(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Jammer-Thread

Beitrag von Chromanoid »

Krishty hat geschrieben:
Chromanoid hat geschrieben:Versuchs mal mit Eclipse oder Netbeans. Eclipse schafft recht locker Projekte mit mehr als 4000 .java Dateien.
Was auch unheimlich aussagekräftig ist – wir wissen ja, dass Java gerade im Hinblick auf seine endlosen Möglichkeiten der Metaprogrammierung und durch die hunderten Header, die am Anfang jeder Datei eingebunden werden, deutlich komplexer zu interpretieren und zu verwalten ist als C++.
Ja das ist klar, dennoch würde mich das echt mal interessieren - schließlich haben beide IDEs guten Cpp Support. Mich würde einfach nur mal interessieren, wie sich so Eclipse oder Netbeans gegenüber MS VS schlägt...
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Jammer-Thread

Beitrag von glassbear »

Chromanoid hat geschrieben:Versuchs mal mit Eclipse oder Netbeans. Eclipse schafft recht locker Projekte mit mehr als 4000 .java Dateien.
Das mag für Java stimmen, für C++ eher nicht. CDT kriegt nichtmal die paar MiB Code auf Arbeit richtig indiziert (C-Code mit etwas C++) :roll:
Da hat selbst vim mit clang-Plugin mehr C/C++-Support und Fähigkeiten...
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Jammer-Thread

Beitrag von Chromanoid »

Ich verstehe, Netbeans auch schon mal getestet? Ich entwickle ja fast ausschließlich Java und bin sehr zufrieden mit Eclipse und Netbeans. Ein kleiner C++ Ausflug mit Netbeans hat mir auch gut gefallen. Aber ohne ein großes C++ Projekt an dem man regelmäßig arbeitet, kann man eine IDE eben nicht auf C++ Tauglichkeit überprüfen. Auf der Suche nach der IDE "to rule them all" (Sprachen nicht andere IDEs ;)) bin ich da immer sehr an Meinungen interessiert.

Soweit ich mich erinnere war Stefan Zerbst zum Beispiel recht zufrieden mit Eclipse (http://zfx.info/viewtopic.php?f=4&t=1492&p=18265#p18265). Ich bräuchte noch ein paar mehr Stimmen um die Behauptung über Untauglichkeit, der ich schon oft begegnet bin, mehr Glauben schenken zu können :). Bisher riecht es für mich nach einer Frage des Geschmacks...
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Man muss auch dazusagen (und das kann ich ja hier, da es ein Jammer-Thread ist), dass C++ mit seinem scheiß Definitionsdateimodell dafür echt suboptimal ist.

Also, falls ihr es nicht wusstet: In jeder C++-Datei landet durch den Präprozessor eine Kopie der Header, die er #includet. Wenn der Präprozessor diese Monsterdatei zusammenschustert, überspringt er Kommentare und per #ifdef deaktivierten Quelltext nicht einfach, sondern ersetzt ihn durch Leerzeichen. Das ist nötig um irgendwas konsistent zu halten; was genau, weiß ich nicht mehr. Dadurch wird jede einzelne .cpp, wenn sie den Compiler erreicht, eine zweistellige MiB-Zahl groß.

Ich habe mal irgendwann mein Framework für fixe Kompilierzeiten optimiert und kann mich erinnern, dass es so ziemlich unmöglich ist, unter 20 MiB zu kommen. Meistens hat sich das dann bei 40 MiB pro .cpp eingependelt. Wenn man die WinAPI oder DirectX einbindet hat man keine Chance, unter diese Werte zu kommen und ich kann mir gut vorstellen, dass bei großen Projekten mit Monstern wie boost früher oder später die 100-MiB-pro-.cpp-Grenze fällt. Guckt euch mal an, wie viele .cpp-Dateien euer Projekt enthält und überschlagt, welche Lawine auf den Compiler zurollt, wenn ihr auf Rebuild drückt.

Der Trend zu Header-only-Bibliotheken macht die Sache nicht besser. Dadurch wird jedes Modul, das diese Bibliothek einbindet, doppelt- bis dreimal so groß, wenn es den Compiler erreicht – Templates und Definitionen sind halt länger als Deklarationen. (Und der Linker wird außerdem mit Symbolen geschwemmt, da die Definitionen der inline-Funktionen in jeder Datei landen, die die Bibliothek #includet.) Auch sind die meisten STLs nicht superpräzise gekapselt; das seht ihr ja allein daran, dass das halbe namespace std verfügbar ist, sobald ihr <iostream> einbindet. (Wer zwischen verschiedenen Compilern portiert, weiß, dass plötzlich Symbole der STL nicht mehr gefunden werden – weil die STL des neuen Systems dann wohl nicht mehr so #include-wütig ist. Darum jedes STL-Objekt, das ihr benutzt, bei C++ Reference nachgucken und den entsprechenden Header einbinden, auch, wenn es zufällig ohne kompiliert.)

Das ist eigentlich katastrophal. Und darum empfiehlt Microsoft auch immer, vorkompilierte Header zu benutzen. Da brechen dann in fast jedem Fall 99 % des Compiler-Inputs weg, auch für IntelliSense. Trotzdem eine Nachlässigkeit im Design, dass es mir schaudert. Da liegt dann auch einer der wenigen Vorteile von hippen Sprachen wie Java. Da muss die Autovervollständigung im Vergleich zu C++ nur ein Hundertstel bis Tausendstel des Inputs verarbeiten.
Zuletzt geändert von Krishty am 02.07.2011, 23:52, insgesamt 3-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Jammer-Thread

Beitrag von Chromanoid »

Krishty hat geschrieben:Da liegt dann auch einer der wenigen Vorteile von hippen Sprachen wie Java.
Naja Java ist ja nicht wirklich hipp :D Die coolen Kids nehmen Scala, Groovy, Ruby und Erlang. Achja LISP/Clojure und Haskell erfreuen sich auch wieder mehr Coolheit :). Und Python nicht vergessen ^^.
Zuletzt geändert von Chromanoid am 03.07.2011, 00:00, insgesamt 1-mal geändert.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

Krishty hat geschrieben:Zu 1.: Wat
Okay, bei der ersten Ausführung kann SiAF ein bisschen dauern. Danach sind es aber wirklich nur Hundertstelsekunden, während FAR jedes Mal zwei Sekunden lädt.
Stimmt, wenn ich SiAF mehrmals benutze, wird es merklich schneller. Allerdings habe ich auch herausgefunden, dass FAR einem weniger Referenzen ausspruckt als SiAF. Das deckt sich mit der folgenden Aussage im Bezug auf die Anzahl durchsuchter Dateien:
Raman Sharma, Program Manager on the VC++ team hat geschrieben:It’s worth mentioning that this search is unlike just searching for some text in the entire solution. This is because for this search, the C++ IDE uses an index to narrow the list of files to search. So it doesn’t look through all the files in the solution. The outcome is significantly better performance than just “Find in Files” (or grep), especially for large solutions.
Bei meinen weiteren Tests, auch mit unterschiedlichen Suchtexten natürlich, hat dann SiAR dann doch weitaus besser abgeschnitten. Ich hatte zuvor nur die Suchzeit am Anfang, nicht aber die Suchzeit beim Expandieren der Baumstruktur beachtet. Mea Culpa. Aber dann ist die Aussage vom Program Manager nur Schwachsinn. Lug und Betrug überall.
Krishty hat geschrieben:Spuckt auch nur die Hälfte aus – wenn die Referenzen auf einen K’tor gesucht werden, werden keine Aufrufe durch Initialisierungslisten gefunden sondern nur der Bezeichner der Klasse gefolgt von einer passenden Parameterliste m(
Bei meinen Test gerade hat er auch Aufrufe in Initialisierungslisten gefunden (was dein Gegenbeispiel natürlich nicht den Rang abläuft). Was ergibt sich, wenn Hide Unconfirmed abgeschaltet wird? (Dies ist übrigens schreckliche Ausdrucksweise. Statt Hide Unconfirmed lieber Show Unconfirmed, sonst muss man bei „Hide Unconfirmed abgeschalten“ zweimal nachdenken.)
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Hide Unconfirmed ändert auch nichts. Igitt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: Jammer-Thread

Beitrag von eXile »

Krishty hat geschrieben:Hide Unconfirmed ändert auch nichts. Igitt.
Riecht für mich nach einem Fall für Connect. Zuvor müsste man ein Minimalbeispiel zusammenbekommen; das könnte hierbei schwierig werden. Hast du mal die Quellcodedatei genommen, mittels /P in Gänze gedumpt, in ein leeres Projekt eingebunden und noch einmal mittels FAR durchsucht? (Wenn du FAR in einer Header-Datei machst, könntest du eine beliebige Quellcodedatei, welche den Header einbindet, nehmen.) Wenn dann der Fehler immer noch auftaucht, könnte man die bis zu einem Minimalbeispiel abspecken.

Alternativ kann man sich auch Dartscheiben mit den Gesichtern des VC++-Teams basteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Keinen Bock – mein Refactoring-Ablauf ist eh auf Strg+Shift+F getrimmt und das Zweite ist schon vor Ewigkeiten langweilig geworden.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Jammer-Thread

Beitrag von glassbear »

Chromanoid hat geschrieben:Ich verstehe, Netbeans auch schon mal getestet? Ich entwickle ja fast ausschließlich Java und bin sehr zufrieden mit Eclipse und Netbeans. Ein kleiner C++ Ausflug mit Netbeans hat mir auch gut gefallen. Aber ohne ein großes C++ Projekt an dem man regelmäßig arbeitet, kann man eine IDE eben nicht auf C++ Tauglichkeit überprüfen. Auf der Suche nach der IDE "to rule them all" (Sprachen nicht andere IDEs ;)) bin ich da immer sehr an Meinungen interessiert.

Soweit ich mich erinnere war Stefan Zerbst zum Beispiel recht zufrieden mit Eclipse (http://zfx.info/viewtopic.php?f=4&t=1492&p=18265#p18265). Ich bräuchte noch ein paar mehr Stimmen um die Behauptung über Untauglichkeit, der ich schon oft begegnet bin, mehr Glauben schenken zu können :). Bisher riecht es für mich nach einer Frage des Geschmacks...
Naja, kaum funktionierende Features sind keine "Frage des Geschmacks". Das ganze hängt auch extrem davon ab, wie groß das Projekt ist. Ideal wäre es, wenn Eclipse/CDT auf Arbeit wenigstens die 150MiB Code Minimalprojekt indizieren könnte. Aber nix da... Und wenn er doch mal "fertig" ist, funktioniert dann trotzdem kaum was, weil der Index Müll ist.

Von Netbeans war ich vor einer Weile sehr begeistert, gerade für C++ und Python. Nach der Übernahme durch Oracle bin ich da etwas unschlüssig, wie lange das Projekt wohl noch leben wird. Und "damals" (6.5-Zeiten, wenn ich mich recht erinner), war die ClearCase-Integration noch nicht so gut und der konnte die 150MiB Minimalcode nicht fertig indizieren. Hatte das mal auf der Entwickler-ML besprochen und die meinten (sinngemäß) "Haja, so große Projekte haben wir damit noch nicht ausprobiert..."

Momentan wechsel ich zwischen SlickEdit auf Arbeit und (g)vim mit clang-Plugin. SlickEdit gibt es auch viel günstiger als Eclipse-Plugin, das wollte ich mir bei Gelegenheit mal anschauen. CodeBlocks fällt raus, die Abhängigkeiten zum Installieren hab ich auf meiner Workstation auf Arbeit nicht :oops:
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Jammer-Thread

Beitrag von Chromanoid »

Soweit ich das sehe hat Java durch Oracle ordentlich an Fahrt gewonnen. Leider wurden auch einige vielversprechende Projekte wie Project Darkstar gestrichen. Aber es hatte eben einen Grund warum Sun nicht besonders rentabel war.
Für Netbeans wurde in der 7er Version der offizielle Python Support eingestellt - angeblich weil zu wenig Leute Interesse hatten. C++ wird aber weiter ausgebaut/gepflegt. Vielleicht mal wieder austesten :) Wenn du an vim gewöhnt bist, gibt es ja jVi vielleicht kannst du damit was anfangen...
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Lynxeye »

Hier muss ich jetzt auch mal einhaken. Eclipse mag man ja vieles anlasten, aber es ist die einzige IDE, die es schafft den kompletten Linuxkernel zu indizieren und mir daraus sinnvolle Vorschläge zu präsentieren. Eclipse ist damit wieder meine Lieblings IDE für C Entwicklung, da mein Vorheriger Favorit Code::Blocks zwar wunderbar zu bedienen ist, aber bei zu vielen zu indizierenden Dateien hoffnungslos die Hufe hochreisst.

GVIM mit cscope schafft das zwar auch, ist für meine Arbeitsabläufe aber nicht halb so effektiv.

Und natürlich frisst Eclipse bei großen Projekten RAM wie kleine, saftige Kinder, aber RAM ist billig.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Code: Alles auswählen

// Packs eight characters of a zero-terminated string into a 64-bit unsigned integer.
explicit // has only one parameter
Identifier(
	ASCIICharacter const * const toZeroTerminatedName
)
	: myValue(0)
{
	auto const numberOfCharacters(::strlen(toZeroTerminatedName));
	assert(8 >= numberOfCharacters);

	for(auto currentCharactersIndex(0u); currentCharactersIndex < numberOfCharacters; ++currentCharactersIndex) {
		UInt8B const nextCharacter(charsetLookup(toZeroTerminatedName[currentCharactersIndex]));
		myValue |= nextCharacter << (8 * currentCharactersIndex);
	}

	return;
}
Seit dieser K’tor 107 Mal mit einem String-Literal als Parameter aufgerufen wird, braucht LTCG nicht mehr drei Sekunden sondern 24. Und dabei kriegt dieser Drecks-Optimizer das ja noch nicht einmal aufgelöst, da er 64-Bit-Shifts nicht statisch auswerten kann. Echt mal, wtf Nehme ich zurück! Er schreibt tatsächlich zweimal mov. Vor ein paar Tagen sah das noch anders aus, da musste ich ja auf zwei 32-Bit-Wörter ausweichen, damit er es optimieren konnte. Für die Berechnung von 1100 64-Bit-Shifts ints 21 Sekunden zu brauchen ist aber trotzdem nicht, was ich von einem Optimizer erwarte.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Hat AutoPlay eigentlich jemals irgendwo keine Probleme gemac

Beitrag von Krishty »

  • über Tage die perfekte Playlist zusammenstellen
  • Daten-CD einlegen
  • Media Player fängt an, TIFF-Bilder abzuspielen
  • stopp, vorherige Wiedergabeliste wiedergeben
  • geht nicht
Bild
  • warum, Microsoft
  • warum
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Krishty hat geschrieben:Und dabei kriegt dieser Drecks-Optimizer das ja noch nicht einmal aufgelöst, da er 64-Bit-Shifts nicht statisch auswerten kann. Echt mal, wtf Nehme ich zurück! Er schreibt tatsächlich zweimal mov. Vor ein paar Tagen sah das noch anders aus, da musste ich ja auf zwei 32-Bit-Wörter ausweichen, damit er es optimieren konnte.
Nichts da, nichts da. Jetzt sehe ich, was passiert: Ist das Objekt statisch, wie in

static Identifier const blubb("foo");

wird kaum optimiert und der K’tor einfach nur geinlined. Ist das Objekt nicht-statisch, wie in

Identifier blubb; blubb = Identifier("foo");

löst der Optimizer es zu zwei movs auf. Was soll denn das?! Ich meine … wa… warum … sollte man sowas wollen?!
ad890233-34fb-45c1-9a0a-617a65a2cb50.jpg
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

eXile vor langer Zeit im Anti-Jammer-Thread hat geschrieben:
Krishty hat geschrieben:XNA Math ist exzellent. Manche Funktion ist bei mir gegenüber selber dahingehackten Mathe-Routinen um 80 % eingebrochen … die Performance ist bei mir leider insgesamt nicht im messbaren Bereich, aber wenn die Ausführungszeit nur halb so viel geschrumpft ist wie die Kompilatgröße, ist das fantastisch. Dafür ist MS aus meiner Alignment-Missgunst fast schon wieder raus.
Wie schaut denn die Performance ohne die Intrinsics von XNA Math aus? Dazu einfach _XM_NO_INTRINSICS_ definieren, mich würde das Resultat sehr interessieren. :)
Die Leistung ist ohne SSE2-Intrinsics 23–76 % höher, abhängig vom Blickwinkel

Bild

Ich vermute stark, dass das mit Branching zusammenhängt – mit Intrinsics ist die Leistung völlig konstant. Ohne reicht das Gucken in eine bestimmte Richtung um die Leistung um 40 % steigen zu lassen, und mit nochmal drehen wieder zurück. Sie ist aber immer um mindestens 23 % höher, und meine CPU-Limitierung bin ich nun auch los. I can't believe this shit

In der Blickrichtung mit dem niedrigstem Unterschied:
  • Intrinsics an:
    • favor size: 280 Hz (100 %)
    • neither: 281 Hz (100 %)
    • favor speed: 278 Hz (99 %)
  • Intrinsics aus:
    • favor size: 335 Hz (119 %)
    • neither: 341 Hz (121 %)
    • favor speed: 340 Hz (121 %)
Nachtrag: Hier kommt noch eine alternative Erklärung: Mir fällt gerade auf, dass ich kein LOD mehr habe, wenn ich mit Intrinsics / Release kompiliere. Intrinsics / Debug und ohne Intrinsics funktionieren hingegen. Bin mal gespannt, wo ich da wieder ein __assume() zu viel hingepflanzt habe.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Jammer-Thread

Beitrag von glassbear »

Lynxeye hat geschrieben:Hier muss ich jetzt auch mal einhaken. Eclipse mag man ja vieles anlasten, aber es ist die einzige IDE, die es schafft den kompletten Linuxkernel zu indizieren und mir daraus sinnvolle Vorschläge zu präsentieren. Eclipse ist damit wieder meine Lieblings IDE für C Entwicklung, da mein Vorheriger Favorit Code::Blocks zwar wunderbar zu bedienen ist, aber bei zu vielen zu indizierenden Dateien hoffnungslos die Hufe hochreisst.

GVIM mit cscope schafft das zwar auch, ist für meine Arbeitsabläufe aber nicht halb so effektiv.

Und natürlich frisst Eclipse bei großen Projekten RAM wie kleine, saftige Kinder, aber RAM ist billig.
Vielleicht liegt das an den (Standard)Einstellungen oder am Code oder an Eclipse 3.6, was wir hier einsetzen. Keine Ahnung. Die Einstellungen sind auf Standard, bis auf 6GiB RAM für das Index-File. 16GiB hat die Kiste hier verbaut, sollten reichen.
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Verdammter AMD-Treiber pfuscht beim anisotropen Filter an Polygonkanten
howse.png
howse.png (2.03 KiB) 2720 mal betrachtet
howse_big.png
Die Kante verläuft, wie man sieht, von links oben nach rechts unten.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Mal ein Quiz für die CProPros neben die Tüte gekotzt:

Ich schreibe mal schnell einen Interpreter. Ich habe einen Call Stack und der Interpreter beginnt mit dem ersten Befehl des Bytecodes als Hauptfunktion auf dem Call Stack:
typedef Word const * InstructionPointer;
InstructionPointer callStack[64];
callStack[0] = toBytecodesBeginning;


Nun hätte ich auch gern einen Zeiger, der mir anzeigt, wo die aktuelle Funktion in diesem Aufrufstapel liegt:
InstructionPointer * toCurrentFunction = &callStack[0]; // Aktuelle Funktion: 0-ter Eintrag des Aufrufstapels, zeigt auf Anfang des Bytecodes

Und jetzt wird munter Bytecode verarbeitet bis die Hauptfunktion zurückkehrt (oder ein Fehler, wie z.B. ein Stapelüberlauf, eintritt):
while(toCurrentFunction >= &callStack[0]) { // so lange weitermachen, bis keine Funktionen mehr auf dem Stapel liegen
  auto const opcode(**toCurrentFunction); // das Wort, auf das der Instruction Pointer der aktuellen Funktion zeigt, als Opcode verwerten
  ++(*toCurrentFunction); // Instruction Pointer der aktuellen Funktion zum nächsten Wort schieben
  switch(opcode) {

    case call:
// Funktionsaufruf
      if(toCurrentFunction + 1 >= toEndOf(CallStack)) // toEndOf() spuckt mir die Adresse des letzten Array-Elements + 1 aus
        throw StackOverrunException();
      ++toCurrentFunction;
      (*toCurrentFunction) = …;
// nimm die Adresse der neuen Funktion sonstwo her, vllt aus dem nächsten Wort im Bytecode
      break;

    case ret:
// Rückkehr aus Funktion
      --toCurrentFunction;
      break;


        // Mehr Anweisungen brauchen wir hier erstmal nicht
    default:
      throw UnknownOpcodeException();

  } // switch
} // while call stack not empty


Das Programm ist fehlerhaft und kann sich entweder aufhängen oder abstürzen, selbst bei einfachstem (validem!) Input. Obwohl es in den meisten Debug-Builds vermutlich funktionieren würde. Wer den pedantischen Grund kennen möchte, kann ja mal hier raten, warum.

Das ist übrigens noch nicht mein Grund zu jammern – was mich wurmt ist, dass der Workaround ein zusätzliches Register verbraucht.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Aramis »

Nun, ich vermute, du beziehst dich auf die Tatsache, dass ein Zeiger auf das Element direkt hinter dem Ende eines Arrays regulaer verwendet (wenngleich nicht dereferenziert) werden darf, ein Zeiger auf das Element VOR dem Beginn eines Arrays aber nicht. Ein solcher Zeiger darf in einem wohlgeformten C++-Programm nicht einmal existieren, geschweige denn zeigerarithmetisch verwertet werden :-)

Ergo darf der Compiler die Schleifenbedingung zu einem while(true) {} optimieren. Oder C: formatieren.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Krishty »

Schweiz: Zwölf Punkte! (Habe ich das richtig gesagt? Ist schon her, dass ich für Aserbaidschan Punkte verlesen habe.) Was für eine Misere, dass ich nur einen Zeiger auf die nächste freie Funktion halten darf (was ein Register mehr verbraucht), oder mit Extraprüfung auf nullptr ausweichen muss, weil toCurrentFunction auf &callStack[0], &callStack[1], … &callStack[64] zeigen kann, aber nicht auf &callStack[-1].

GCC wendet diese Optimierung übrigens durchaus an – es gab Verordnungen bestimmter US-Behörden, Strings in sicherheitskritischen Programmen zwecks Exploit-Erkennung auf Überläufe zu testen. Bloß mussten sie bald feststellen, dass diese Tests es nur mit einem von drei Compilern in den Maschinentext geschafft haben und sonst immer verworfen wurden, weil sie nicht wohldefiniert waren.

Aus einem ähnlichen Grund können Schleifen, die mit int (oder Zeigern) iteriert werden, aggressiver optimiert werden als welche, die mit unsigned int iteriert werden: bei unsigned int sind Über- und Unterläufe als Zweierkomplement wohldefiniert – allerdings bedeutet das für den Compiler, dass er nicht von i + 1 > i ausgehen kann und die Schleife dadurch wahlweise garnicht, eine bestimmte Anzahl Mal oder unendlich oft ausgeführt werden könnte. Bei int und Zeigern sind Überläufe nicht vorgesehen; der Compiler darf diese Möglichkeiten also ignorieren. Eine Chance, die LLVM stark ausnutzt. Visual C++ natürlich nicht – schließlich existiert all der schlechte Text der Windows-Welt nur deshalb, weil Visual C++ ihn weiter schluckt. Aber das intuitiv Richtige zu tun widerspricht ja nicht der Tatsache, dass es nicht definiert ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Schrompf »

Ich finde es immer wieder schön, durch stilles Mitlesen noch was lernen zu können. Auch wenn die behandelten Probleme inzwischen so weit weg von der Welt eines ergebnisorientierten Entwicklers sind, dass ich mir anfangs schon an den Kopf gegriffen habe. std::strack<DeinFunktionszeiger> und fertig.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: Jammer-Thread

Beitrag von Jörg »

...oder einen Dummy-Eintrag am Anfang deines Arrays 'opfern'.
Antworten