Jammer-Thread
- Schrompf
- Moderator
- Beiträge: 5047
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Jammer-Thread
10$ Preis? Dann hol es Dir doch. Oder hab ich da was übersehen?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Artificial Mind
- Establishment
- Beiträge: 802
- Registriert: 17.12.2007, 17:51
- Wohnort: Aachen
Re: Jammer-Thread
Toa-chan hat nicht genügend Mäuse auf seinem Paypal :D
-
- Establishment
- Beiträge: 324
- Registriert: 08.04.2003, 18:09
- Alter Benutzername: Enrico_
- Echter Name: Enrico
- Wohnort: San Diego
- Kontaktdaten:
Re: Jammer-Thread
Geil, jetzt macht sogar meine Bank auf Kontoauszuegen und im Internet in der Kontouebersicht Werbung zwischen den Posten basierend auf dem, wo ich mein Geld so ausgebe :shock:
Das sind javascript-Dinger, die ich nicht geblockt kriege :evil:
Das sind javascript-Dinger, die ich nicht geblockt kriege :evil:
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!
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
Gibt es einen Grund, warum die STL mit algorithm(src, srcEnd, dest) genau dem Gegenteil von memcpy/memmove(dest, src, size) entspricht? Ich halte mich meist an die STL-Reihenfolge und habe es prompt in einem Algorithmus verhauen, indem ich dest und src von memmove verdreht hatte. :evil:
Etwas Anti-Jammer: Zum ersten Mal seit unzähligen Jahren habe ich durchgehende Hot-Swap-Funktionalität, einigermaßen elegant und für alle Ressourcen-Typen und Subsysteme. Um dabei nicht in Objekt-Abhängigkeiten zu ersticken, habe ich ein zentrales Monitoring-Objekt, das die Typen gerade geänderter Komponenten sammelt und abhängigen Subsystemen zur Abfrage bereit hält. Der Austausch alter Ressourcen durch neue Ressourcen erfolgt durch einen einfachen Nachfolger-Zeiger in der alten Ressource, der von der Ressourcenverwaltung bei Veränderung gesetzt wird und von abhängigen Subsystemen ausgelesen wird.
Etwas Anti-Jammer: Zum ersten Mal seit unzähligen Jahren habe ich durchgehende Hot-Swap-Funktionalität, einigermaßen elegant und für alle Ressourcen-Typen und Subsysteme. Um dabei nicht in Objekt-Abhängigkeiten zu ersticken, habe ich ein zentrales Monitoring-Objekt, das die Typen gerade geänderter Komponenten sammelt und abhängigen Subsystemen zur Abfrage bereit hält. Der Austausch alter Ressourcen durch neue Ressourcen erfolgt durch einen einfachen Nachfolger-Zeiger in der alten Ressource, der von der Ressourcenverwaltung bei Veränderung gesetzt wird und von abhängigen Subsystemen ausgelesen wird.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Re: Jammer-Thread
Jemand hat mir mal erzählt, dass die Reihenfolge von memcpy/memmove die entsprechende Assembler-Reihenfolge aus Gewohnheitsgründen widerspiegelt (also mov eax,0h). Warum aber die Reihenfolge in der STL dann umgekehrt ist, erklärt das aber nicht. Vielleicht ist es die Umstellung von mathematischer Notation (dest = src) auf Zuweisungsnotation der Informatik (src → dest).CodingCat hat geschrieben:Gibt es einen Grund, warum die STL mit algorithm(src, srcEnd, dest) genau dem Gegenteil von memcpy/memmove(dest, src, size) entspricht? Ich halte mich meist an die STL-Reihenfolge und habe es prompt in einem Algorithmus verhauen, indem ich dest und src von memmove verdreht hatte. :evil:
Re: Jammer-Thread
Ich vermute mal, dass die meisten gängigen Programmiersprachen die Reihenfolge (source, destination) benutzen, weil sie "natürlicher" ist. Mit Sicherheit weiß ich das von C# und Java. Wenn man nun Algorithmen, oder gar ganze Engines oder Programme, von einer Sprache in eine andere portieren muss, dann vergisst man schnell mal die Reihenfolge umzudrehen. Mir persönlich ist das bisher nur einmal passiert, aber ich war dabei als eine 2D engine für mobile Geräte erst in Java geschrieben, dann nach C++, und dann von C++ nach C# portiert wurde. Und jedes Mal hat sich diese Reihenfolge umgedreht. Auch Wartung und der Einbau neuer Features mussten immer gleich in 3 Sprachen geschehen. Da hätte man sich manchmal gewünscht, dass diese Reihenfolge überall dieselbe wäre.CodingCat hat geschrieben:Gibt es einen Grund, warum die STL mit algorithm(src, srcEnd, dest) genau dem Gegenteil von memcpy/memmove(dest, src, size) entspricht? Ich halte mich meist an die STL-Reihenfolge und habe es prompt in einem Algorithmus verhauen, indem ich dest und src von memmove verdreht hatte. :evil:
Man beachte übrigens wie ich automatisch "von C++ nach C#" (source, destination) geschrieben habe, und nicht "nach C# von C++" (destination, source).
Re: Jammer-Thread
Jetzt hab ich nen neuen USB-Raketenwerfer, aber irgendwie will der sich nicht untersuchen lassen. Ich hab zwar alle, für die USB-Verbindung zu meinem Programm benötigten Daten bereits gesammelt, was nich so schwer is, stehen im Geräte-Manager, aber mein Computer sagt Nein.
Was ich sehr komisch finde ist, dass ich mich nicht mal mit dem Raketenwerfer verbinden kann, dass ging bis jetzt bei jedem Raketenwerfer sofort.
Das nervt ein wenig.
Was ich sehr komisch finde ist, dass ich mich nicht mal mit dem Raketenwerfer verbinden kann, dass ging bis jetzt bei jedem Raketenwerfer sofort.
Das nervt ein wenig.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
War es früher schon praktisch unmöglich, Qt zum Laufen zu bekommen, so ist dies mit Qt 5 noch einmal konsequent weiterentwickelt worden. Qt 5 - designed not to run - erfordert erstmals Python zur Konfiguration. qmake erbricht sich dann wie gewohnt in einer bunten Mischung aus absoluten und relativen Pfaden. Neu ist, dass die generierten Projektdateien nicht mal mehr in ihrem Originalverzeichnis kompilierbar sind, weil CPP-Dateien mit speziellen Einstellungen jetzt per Custom Build Tool eingebunden werden, wobei die entsprechende cl-Kommandozeile ganz offensichtlich unvollständig ist. Hat man diese Kommandozeilen dann händisch um die vielzähligen projektweiten Präprozessordefinitionen erweitert, libcmt.lib auf die Ignore-Liste des Linkers gesetzt, Manifest-Einbettung deaktiviert und ein totes Kaninchen bei Vollmond vergraben, beglückt einen der Linker ggf. mit einigen Binaries. Kurz darauf stellt man beim Starten der eigenen Qt-Anwendung fest, dass es neuerdings eine Plugin-Architektur gibt, und Unterstützung für einzelne Plattformen jetzt in Plattform-Plugins ausgelagert ist. Diese Plugins verstecken sich in einem weiteren Unterordern des qtbase/src-Ordners, der ebenfalls gebaut werden will. Diese Plugin-Dlls haben dann in einem plugin/platforms-Ordner der ausführbaren Anwendungsdatei zu liegen, wo ich sie soeben hinbugsiert habe. Nun startet meine Anwendung endlich mit folgender vielversprechenden Meldung: Failed to load platform plugin "windows". Available platforms are: windows, minimal. Das ist vor dem Crash.
Nachtrag: Ich hatte versehentlich die Plugin-DLLs aus den pre-built VS2010 Qt Binaries kopiert anstatt der selbstgebauten. Mit den selbstgebauten geht es nun.
Nachtrag: Ich hatte versehentlich die Plugin-DLLs aus den pre-built VS2010 Qt Binaries kopiert anstatt der selbstgebauten. Mit den selbstgebauten geht es nun.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Re: Jammer-Thread
Genau aus diesem Grund gibt es Distributoren, die sich darum kümmern, dass aus Quellcode Binaries entstehen, die genau auf dein System zugeschnitten sind. Warum machst du dir die Arbeit selber?CodingCat hat geschrieben:War es früher schon praktisch unmöglich, Qt zum Laufen zu bekommen, so ist dies mit Qt 5 noch einmal konsequent weiterentwickelt worden. Qt 5 - designed not to run - erfordert erstmals Python zur Konfiguration. qmake erbricht sich dann wie gewohnt in einer bunten Mischung aus absoluten und relativen Pfaden. Neu ist, dass die generierten Projektdateien nicht mal mehr in ihrem Originalverzeichnis kompilierbar sind, weil CPP-Dateien mit speziellen Einstellungen jetzt per Custom Build Tool eingebunden werden, wobei die entsprechende cl-Kommandozeile ganz offensichtlich unvollständig ist. Hat man diese Kommandozeilen dann händisch um die vielzähligen projektweiten Präprozessordefinitionen erweitert, libcmt.lib auf die Ignore-Liste des Linkers gesetzt, Manifest-Einbettung deaktiviert und ein totes Kaninchen bei Vollmond vergraben, beglückt einen der Linker ggf. mit einigen Binaries. Kurz darauf stellt man beim Starten der eigenen Qt-Anwendung fest, dass es neuerdings eine Plugin-Architektur gibt, und Unterstützung für einzelne Plattformen jetzt in Plattform-Plugins ausgelagert ist. Diese Plugins verstecken sich in einem weiteren Unterordern des qtbase/src-Ordners, der ebenfalls gebaut werden will. Diese Plugin-Dlls haben dann in einem plugin/platforms-Ordner der ausführbaren Anwendungsdatei zu liegen, wo ich sie soeben hinbugsiert habe. Nun startet meine Anwendung endlich mit folgender vielversprechenden Meldung: Failed to load platform plugin "windows". Available platforms are: windows, minimal. Das ist vor dem Crash.
Nachtrag: Ich hatte versehentlich die Plugin-DLLs aus den pre-built VS2010 Qt Binaries kopiert anstatt der selbstgebauten. Mit den selbstgebauten geht es nun.
http://fedoraproject.org/ <-- freies Betriebssystem
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
http://launix.de <-- kompetente Firma
In allen Posts ist das imo und das afaik inbegriffen.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
Weil es keine Binaries gibt, die auf mein System zugeschnitten sind.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
-
- Establishment
- Beiträge: 201
- Registriert: 07.07.2010, 13:00
- Kontaktdaten:
Re: Jammer-Thread
Für Masochisten gibts den ganzen Spaß auch in der VS2012-Version mit extra viel Compiler-Fehlern und Linker-Problemen.
Imaging-Software und bald auch Middleware: http://fd-imaging.com
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Ich hatte mal leise aufgeschnappt, dass für C++11 einige Regeln betreffend Aliasing an C99 angepasst worden seien. Kennt zufälligerweise jemand einen guten Artikel dazu oder kann mir erklären, was genau da passiert ist? Vielleicht verwechsle ich das ja bloß mit den C99-Integertypen, die in den Standard gezogen wurden …
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Bah ist Gimp scheiße zu benutzen. Dauernd irgendwelche Knöpfe, die nicht reagieren; Textboxen, in denen ich nicht richtig markieren kann, und Ordneransichten, in denen ich mich nicht zurechtfinde.
Ich denke, dass jeder, der eine plattformunabhängig gleiche GUI baut, ein Vollidiot ist. Diese Kasper, die meinen, dass sich Knöpfe überall gleich bedienen lassen müssen, sind wahrscheinlich dieselbe Gattung Radikaler, die den Java-Gleitkommastandard erfunden haben, und drehen mir die Eingeweide auf links.
Ich benutze Windows. Ich will, dass sich alle Bedienelemente, die ich auf diesem System jemals befummeln muss, so anfühlen, wie ich es von Windows-Bedienelementen gewohnt bin. I'm talking Klickbereich. I'm talking Markierungsfarbe. And I'm talking Verhalten beim Wegziehen. Das gilt für GTK+, für Java-Klickibunti und alles andere da draußen auch.
Wer seine GUI so auslegt, dass sie sich überall maximal vom Rest des Systems unterscheidet und damit argumentiert, dass -1 und +1 wieder 0 ergeben, gehört öffentlich gedemütigt damit er nie wieder auf die Scheißidee kommt, sich an eine Benutzeroberfläche zu trauen.
Ich denke, dass jeder, der eine plattformunabhängig gleiche GUI baut, ein Vollidiot ist. Diese Kasper, die meinen, dass sich Knöpfe überall gleich bedienen lassen müssen, sind wahrscheinlich dieselbe Gattung Radikaler, die den Java-Gleitkommastandard erfunden haben, und drehen mir die Eingeweide auf links.
Ich benutze Windows. Ich will, dass sich alle Bedienelemente, die ich auf diesem System jemals befummeln muss, so anfühlen, wie ich es von Windows-Bedienelementen gewohnt bin. I'm talking Klickbereich. I'm talking Markierungsfarbe. And I'm talking Verhalten beim Wegziehen. Das gilt für GTK+, für Java-Klickibunti und alles andere da draußen auch.
Wer seine GUI so auslegt, dass sie sich überall maximal vom Rest des Systems unterscheidet und damit argumentiert, dass -1 und +1 wieder 0 ergeben, gehört öffentlich gedemütigt damit er nie wieder auf die Scheißidee kommt, sich an eine Benutzeroberfläche zu trauen.
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Jammer-Thread
Du sprichst mir aus der Seele...
Zuletzt geändert von dot am 19.01.2013, 23:51, insgesamt 1-mal geändert.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: Jammer-Thread
Merkwuerdigerweise sind plattformunabhaengige GUIs besser wenn sie primaer unter Windows oder unter Mac OS X entwickelt wurden - auch unter Linux. Mysterioes.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
Leute! Qt ist ja so ein Framework, das hervorragende Funktionalität bietet und wunderbar natives UI-Verhalten aufweist (ok, ich kenne nur die Windows-Seite). Nun habe ich aber die letzten paar Tage einen sehr großen Teil meiner Zeit damit verbringen müssen Qt 5 zu debuggen. Die eingebaute Docking-Oberfläche, bisher wirklich ein positives Alleinstellungsmerkmal unter all den UI-Frameworks da draußen, ist komplett im Eimer. Und das, was ich beim Durchsteppen sehe, treibt mich Qt-gewohnt in den Wahnsinn. Einfache Logik und Struktur ist nicht erkennbar, das Ganze sieht aus wie das Ergebnis von unzähligen durchsoffenen Trial-&Error-Nächten. Wenn ihr mal sehen wollt, wovon Krishty und sein eifriger Papagei hier sprechen, wenn sie von unendlich ausgedehnten Zustandsräumen und Zustandsproliferation erzählen, dann nehmt euch irgendeine Stelle in der QtGui; genau das ist die in diesem Fall unausweichliche State Hell, die keine Seele heil lässt. Sollte es in diesem undurchdringlichen Haufen nur einen Hauch von Konsistenzgarantien geben, dann liegen diese in einer verschlossenen Schublade des eingestürzten Trolltech-Geheimarchivs und haben ihre Gültigkeit längst eingebüßt.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
WARUM arbeiten List Views im Jahre 2013 immer noch mit INDIZES?! Ich hatte zunächst geglaubt QModelIndex wäre ein netter Wrapper mit automatischer Aktualisierung; Pustekuchen:
Vorher: 1 | 2 | 3 | 4
Nachher: 1 | 3
Ich möchte nicht wissen, in wie viel Code da draußen solche Lücken unbemerkt schlummern.
Code: Alles auswählen
Q_FOREACH (QModelIndex idx, this->selectedIndexes())
{
lean::scoped_ptr<QStandardItem> item( model->takeItem(idx.row()) );
model->removeRow(idx.row());
Q_EMIT itemDeleted(item);
}
Nachher: 1 | 3
Ich möchte nicht wissen, in wie viel Code da draußen solche Lücken unbemerkt schlummern.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Re: Jammer-Thread
Der Qt Standardweg für das was du erreichen willst ist aber dass dein abgeleitetes Model eine Methode removeRows() anbietet, denen du einen QModelIndex-Bereich übergeben kannst. Das löschen von Zeilen wird mit beginRemoveRows() und endRemoveRows() markiert. Aber die Model-Item-Klassen von Qt sind auch manchmal etwas unintuitiv und eklig zu debuggen.
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
Fang bloß nicht mit Qt Models an, diese Dinger werde ich in meinem Leben freiwillig nicht mehr anrühren. Aus dieser indexüberladenen Hölle kommt das ganze Übel ja gerade. Zum Glück reicht praktisch immer QStandardItemModel. QAbstractItemModel sicher selbst zu implementieren erscheint mir ein Himmelfahrtskommando; trotz umfassender Doku ist dieses aufgedunsene Schwammgewächs ja nicht mal in seinem intendierten Verhalten voll zu erfassen.
Übrigens hilft removeRows() so oder so nicht - das QStandardItemModel bietet diese Funktion ja auch - die Indizes sind jedoch schlichtweg nicht konsekutiv. Da mir in diesem Müllberg von Framework inzwischen ohnehin alles egal ist, hole ich mir einfach nach jeder gelöschten Zeile erneut die Liste selektierter Indizes.
Übrigens hilft removeRows() so oder so nicht - das QStandardItemModel bietet diese Funktion ja auch - die Indizes sind jedoch schlichtweg nicht konsekutiv. Da mir in diesem Müllberg von Framework inzwischen ohnehin alles egal ist, hole ich mir einfach nach jeder gelöschten Zeile erneut die Liste selektierter Indizes.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- Schrompf
- Moderator
- Beiträge: 5047
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: Jammer-Thread
Falsch:
Richtig:
Das eine endet in einer Endlosschleife, das andere funktioniert. Ich muss noch viel lernen, bevor ich den schwarzen Gürtel im Bitschubsen erwerben kann.
Code: Alles auswählen
uint64_t muster = (1 << unterstesBit);
Code: Alles auswählen
uint64_t muster = (1ull << unterstesBit);
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Dann warte erstmal unsigned infection ab (wenn dir irgendwann in einer Zeile das Vorzeichen verloren geht weil einer der Operanden unsigned deklariert ist) … C++’ Ganzzahltypen und -Literale sind ein schlechter Scherz.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Wie bescheuert ist Visual C++ eigentlich? Hier aus meiner binären Suche:
while(toBeginning < toEnd) {
auto const toSample = toBeginning + (toEnd - toBeginning) / 2;
Die zweite Zeile erzeugt den folgenden Maschinentext:
mov rax,r8
sub rax,r9
sar rax,4
cqo
sub rax,rdx
sar rax,1
shl rax,4
add rax,r9
What. cqo? Etwa Convert Quad to Oct, das Visual C++ vor vorzeichenbehafteten Divisionen einsetzt, um das Vorzeichen der Zahl zu replizieren?!
Ja; genau das.
Steht nicht eine Zeile höher, dass das Ergebnis der Subtraktion unmöglich negativ sein kann?
Ja.
*seufz*
Also von Hand:
while(toBeginning < toEnd) {
auto const toSample = toBeginning + uintptr_t(toEnd - toBeginning) / 2u;
mov rax,r8
sub rax,r9
sar rax,4
shr rax,1
shl rax,4
add rax,r9
Wieder zwei Befehle gespart.
Dabei hatte ich den x64-Compiler von VS2012 ja schon fast gelobt. Aber seit ich für alles nur noch Iteratoren (lies: Zeiger) benutze, und festgestellt habe, dass der mit Zeigerarithmetik absolut nicht zurechtkommt, ist wieder alles beim Alten.
while(toBeginning < toEnd) {
auto const toSample = toBeginning + (toEnd - toBeginning) / 2;
Die zweite Zeile erzeugt den folgenden Maschinentext:
mov rax,r8
sub rax,r9
sar rax,4
cqo
sub rax,rdx
sar rax,1
shl rax,4
add rax,r9
What. cqo? Etwa Convert Quad to Oct, das Visual C++ vor vorzeichenbehafteten Divisionen einsetzt, um das Vorzeichen der Zahl zu replizieren?!
Ja; genau das.
Steht nicht eine Zeile höher, dass das Ergebnis der Subtraktion unmöglich negativ sein kann?
Ja.
*seufz*
Also von Hand:
while(toBeginning < toEnd) {
auto const toSample = toBeginning + uintptr_t(toEnd - toBeginning) / 2u;
mov rax,r8
sub rax,r9
sar rax,4
shr rax,1
shl rax,4
add rax,r9
Wieder zwei Befehle gespart.
Dabei hatte ich den x64-Compiler von VS2012 ja schon fast gelobt. Aber seit ich für alles nur noch Iteratoren (lies: Zeiger) benutze, und festgestellt habe, dass der mit Zeigerarithmetik absolut nicht zurechtkommt, ist wieder alles beim Alten.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Warum erzeugt Visual C++ für do while-Schleifen konsequent besseren Maschinentext als für for-? Gibt es da irgendwelche technischen Gründe, dass zusätzliche Invarianten gelten oder so?
- dot
- Establishment
- Beiträge: 1745
- Registriert: 06.03.2004, 18:10
- Echter Name: Michael Kenzel
- Kontaktdaten:
Re: Jammer-Thread
Wär mal interessant, ob du in dem Fall mit __assume() was erreichen kannst.Krishty hat geschrieben:Steht nicht eine Zeile höher, dass das Ergebnis der Subtraktion unmöglich negativ sein kann?
Edit: Ok, vermutlich nicht...
Wirklich generell, oder bei einer ganz bestimmten Form von Schleife?Krishty hat geschrieben:Warum erzeugt Visual C++ für do while-Schleifen konsequent besseren Maschinentext als für for-? Gibt es da irgendwelche technischen Gründe, dass zusätzliche Invarianten gelten oder so?
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Keine Ahnung – ich habe mir vor ein paar Monaten angewöhnt, wieder do while-Schleifen zu verwenden; und eben zum dritten Mal bemerkt, dass dadurch weniger Maschinentext produziert wurde. Könnte auch mit meinem Hang zu Iteratoren zusammenhängen. Testfall …
for mit Zähler (21 Befehle (ja – scheiß Maß; aber das ist halt, was ich beim Drübergucken sehe)):for mit Iterator (25 Befehle (WTF!)):do while mit Iterator (19 Befehle):Visual C++ 2012 x64.
for mit Zähler (21 Befehle (ja – scheiß Maß; aber das ist halt, was ich beim Drübergucken sehe)):
- CodingCat
- Establishment
- Beiträge: 1857
- Registriert: 02.03.2009, 21:25
- Wohnort: Student @ KIT
- Kontaktdaten:
Re: Jammer-Thread
In deinem Testfall dupliziert die for-Schleife die Bedingung einfach, einmal für den Eingang und einmal für die Wiederholung. Ich vermute das geschieht zur Vermeidung von Doppelsprüngen. Deine do ... while Schleife erfordert in der Tat eine zusätzliche Invariante, nämlich dass deine Iterator-Range nicht leer ist. In C++-Code zurückübersetzt führt der Compiler einfach folgendes durch:Krishty hat geschrieben:Warum erzeugt Visual C++ für do while-Schleifen konsequent besseren Maschinentext als für for-? Gibt es da irgendwelche technischen Gründe, dass zusätzliche Invarianten gelten oder so?
Code: Alles auswählen
//von
for (a; b; c) ...
// zu
a;
if (b) do { ...; c; } while (b)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Die Katze hat absolut recht; ja! Ich dachte, die Zeiten, in denen Sprungvorhersage Rücksprünge bevorzugt, wären vorbei … und ja; das ist echt traurig. Gut, dass du mich drauf aufmerksam gemacht hast; ich werde meinen Text jetzt so schreiben wie 1985.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Gut, dass du mir das gesagt hast, Cat – bei genauem Hinsehen fällt mir auf, dass Visual C++ für jedes Attribut innerhalb einer Methode Aliasing oder Wirkung anzunehmen scheint. Manche Schleifen schrumpfen hier um 25 % zusammen, sobald ich die Obergrenze in eine lokale Variable schreibe.
Ich vermute, dass das damals der Grund war, dass der Kompressionsalgorithmus schneller wurde, nachdem ich ihn aus seiner Klasse genommen und in freie Funktionen mit einer struct Context gesteckt habe.
Übrigens noch eine Erinnerung für deine Ranges: Falls du Zeiger auf Anfang und Ende speicherst, implementiere isEmpty() nicht als 0 == count() sondern als begin() == end(). VC kann nämlich nur schwach Zeigerarithmetik optimieren und würde für die erste Version tatsächlich Subtraktion und Division vor dem Vergleich ausspucken. Benutz count() am besten nur, falls es sich nicht vermeiden lässt.
Wie eine Zeitreise zurück zu Visual C++ 6.0, das alles …
Ich vermute, dass das damals der Grund war, dass der Kompressionsalgorithmus schneller wurde, nachdem ich ihn aus seiner Klasse genommen und in freie Funktionen mit einer struct Context gesteckt habe.
Übrigens noch eine Erinnerung für deine Ranges: Falls du Zeiger auf Anfang und Ende speicherst, implementiere isEmpty() nicht als 0 == count() sondern als begin() == end(). VC kann nämlich nur schwach Zeigerarithmetik optimieren und würde für die erste Version tatsächlich Subtraktion und Division vor dem Vergleich ausspucken. Benutz count() am besten nur, falls es sich nicht vermeiden lässt.
Wie eine Zeitreise zurück zu Visual C++ 6.0, das alles …
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: Jammer-Thread
Ich hatte ja schonmal geschrieben, dass ich meine Engine deutlich schneller gekriegt habe, indem ich in Schleifen von Indizes auf Iteratoren (Zeiger) umgestiegen bin. Jetzt wühle ich mich gerade durch alle Schleifen meines Programms, und finde dabei immer wieder solche Stellen. Je nach Schleife liegt die Verbesserung höchstens am Rand des Rauschens; manchmal 0,5 %; manchmal 2. Aber in der Masse wird es ziemlich deutlich spürbar. Und das alles, obwohl der Text mit Iteratoren größer wird als mit Zählern. Ich erreiche bald 60 Hz Full HD auf einem Core 2 Quad statt auf einem Core i7.
Entweder ist dieses ganze Gerede von superskalarer OoO-Ausführung und LEA als Nulltaktanweisung totaler Unsinn, oder meine Schleifen sind allesamt hart Registerlimitiert. Oder die Benchmarks, die was in die Gegenrichtung beweisen, sind alle realitätsfremd. Irgendwas stimmt jedenfalls nicht mit dem, was mir die Leute immer erzählen.
P.S.: 3000stes Gejammer schon … wer das hier liest muss ja echt überzeugt sein, dass die IT am Abgrund steht …
… und noch peinlicher ist, dass ich aktuell knapp über 3200 Nachrichten erstellt habe und hier gerade alles mit mir vollgekleistert ist.
Entweder ist dieses ganze Gerede von superskalarer OoO-Ausführung und LEA als Nulltaktanweisung totaler Unsinn, oder meine Schleifen sind allesamt hart Registerlimitiert. Oder die Benchmarks, die was in die Gegenrichtung beweisen, sind alle realitätsfremd. Irgendwas stimmt jedenfalls nicht mit dem, was mir die Leute immer erzählen.
P.S.: 3000stes Gejammer schon … wer das hier liest muss ja echt überzeugt sein, dass die IT am Abgrund steht …
… und noch peinlicher ist, dass ich aktuell knapp über 3200 Nachrichten erstellt habe und hier gerade alles mit mir vollgekleistert ist.