Neue MinGW Versionen von TDM erzeugen scheinbar langsameren Code
-
Hallo Alle Zusammen.
Lange Zeit habe ich für mein Projekt MuLanPa ( www.sourceforge.net/projects/mulanpa MinGW 4.4.1
("gcc-4.4.1-tdm-2") benutzt jetzt habe ich auf MinGW 4.7.1 ("tdm-gcc-4.7.1-2") gewechselt und das Resultat arbeitet erheblich langsamer. Auch die neuste Version "tdm-gcc-4.8.1-3" führt eher zu noch langsameren Ergebnissen.Ich kann aber nicht glauben, daß das an MinGW liegt. Vielmehr vermute ich, daß die Optimierungs-Optionen sich geändert haben und ich die entsprechenden Konfigurationen in emeiner Code::Blocks Umgebung anpassen muß. Weiß jemand, was sich bei MinGW geändert hat.
Ich arbeite in Windows XP SP3 und mein Programm benutzt die boost (1.54) Bibliothek Spirit (haufenweise Templates) und davon die ältere Clasic-Variante.
Mit freundlichen Grüßen,
Eckard Klotz.
-
Hallo Allerseits.
Inzwischen habe ich eine Lösung für mich gefunden. Obwohl ich nicht sagen kann, ob es sich dabei wirklich um der Weisheit letzter Spruch handelt, möchte ich hier zu mindest versuchen meine bisherigen Erfahrungen zu teilen, bzw. sie zur Diskussion zustellen.
Die Ursache meines Problems scheint in der Implementierung von Ausnahme-Behandlungen zu liegen, die von Compiler auf 2 verschiedene Arten vorgenommen wird. Hierbei handelt es sich aber um keine Konfigurierbare Aktionen, sondern um ein nicht änderbares Verhalten des installierten MinGW Paketes von TDM (http://tdm-gcc.tdragon.net). Wie sich aber herausgestellt hat, kann man ein zweites Paket herunterladen, in dem dann das Alternativ-Verhalten zum Tragen kommt. In der IDE konfiguriert man dann nicht einen Compiler, sonder wählt zwischen zwei unabhängig installierten Compilern aus.
Leider scheint TDM kein eigenes Forum zu haben, wo man Einzelheiten darüber diskutieren könnte nur ein Bug-Tracker. Ich habe zwar versucht dort mein Problem zu schildern, da es sich aber nicht um einen Bug sondern eher um ein Feature handelt denke ich, daß dort nicht mehr zu erwarten ist, als ein Hinweis, daß es sich halt nicht um einen Bug handelt.
Inzwischen habe ich aber ein paar Hinweise unter "TDM32 exception unwinder formats (SJLJ vs DW2)" (http://tdm-gcc.tdragon.net/quirks) gefunden, die ich kurz durch meine daraus gewonnenen Schlüsse ergänzen möchte. Ich weise aber gleich darauf hin, daß es sich hier nur um Auszüge handelt. Weiterhin habe ich auch noch nicht alles wirklich verstanden und der geneigte Leser, der mehr davon versteht, hat mit Sicherheit das Bedürfnis meine Angaben zu korrigieren, was mir sehr willkommen wäre.
•The TDM32 edition of TDM-GCC comes in two different flavors with respect to how it propagates exceptions in compiled programs.
Wie ich schon angedeutet habe, es gibt zwei verschiedene von einander unabhängig arbeitende Pakete.
•The default flavor uses a method called "SJLJ", which stands for "setjmp/longjmp".
Was immer sich im einzelnen unter "SJLJ" verbirgt, es ist das was man bekommt, wenn man das normale Installations-Paket herunterlädt.•The second flavor of the TDM32 edition uses a method called "DW2", which stands for "Dwarf-2".
Was immer sich im einzelnen unter "DW2" verbirgt, um es zu bekommen, muß man im Download Verzeichnis etwas suchen, um dann ein paar Zip-Archive zu finden, welche man dann entpackt.
•SJLJ slows your program down somewhat - it adds some additional code to every function you write to account for handling exceptions, and that code is always executed.
Genau das war auch meine Erfahrung. Meine DOS-Programme waren plötzlich 30 mal langsamer als bei Verwendung einer älteren Version von MinGW.
•DW2 is mostly faster than SJLJ. It doesn't add any additional code to your functions, so during normal program execution (no exception being thrown) there is no overhead.
Nach Umstellung auf DW2 hatte ich wieder die Geschwindigkeit von früher.
•However, DW2 generates tables of data that are stored alongside your code to help out when an exception is thrown. This means that your programs will be larger than they would be using the SJLJ flavor.
Ich denke ein etwas größeres Programm ist für mich kein wirklich schwerwiegendes Problem, da meine Programme nur etwas größer als ein MB sind, was heute nicht wirklich viel ist.
•Finally, DW2 is actually slower than SJLJ when an exception is thrown, because it has to perform additional calculations based on the stored data to determine how to handle the exception.
•However, you can choose the DW2 flavor if you prefer, as long as you can guarantee that you'll only need to propagate exceptions through code that is compiled with the same compiler, or another DW2-enabled GCC toolchain.Es ist natürlich richtig, daß die Implementierung einer zuverlässigen Ausnahmebehandlung ihren guten Grund hat. Das heißt, das was der Anwender später an Laufzeit spart, muß man vorher mit nicht unerheblichen Aufwand während der Entwicklung erst ein Mal erarbeiten. Andersherum habe ich die Erfahrung gemacht, daß eine zu gute Ausnahme-Behandlung auch ihre Schattenseiten hat. Es geschieht dann leicht, daß das Programm zwar nicht abstürzt trotzdem aber seine Aufgabe nicht erfüllt. man findet nur leider das Problem nicht, weil das Resultat an einer komplett andern Stelle im Algorithmus aktiv wird und die Ursache durch die Ausnahme-Behandlung verdeckt wird. Würde an dieser Stelle das Programm einfach abstürzen könnte man mit Hilfe von Log-Outputs das Problem schneller einkreisen.
•The DW2 flavor comes as a completely separate set of downloads. The TDM-GCC installer won't let you install both the SJLJ flavor and the DW2 flavor in the same location. However, you can merge the two installations on your own if you really want to, because the DW2 files either have "-dw2" tacked onto their names, or are stored in subdirectories with different names. There are a few duplicate files, which can safely be overwritten and used with either flavor.
Ich habe dann mein SJLJ Installations-Verzeichnis kopiert und dann den Inhalt der DW2 Archive hinein kopiert. Leider war ich nicht in der Lage, die DW2 Version anders zum Laufen zu bringen.
Wie schon angemerkt, dieses ist nur eine Ansammlung kurzer Kommentare zu dem was ich bisher gefunden habe. Und die Zitate, die ich angefügt habe sind nur Ausschnitte einer größeren Ansammlung von Punkten zu diesem Thema. Wenn also jemand meint ich habe etwas falsch dargestellt, dann mag das durchaus zutreffen und ich würde mich über jede Ergänzung oder Klarstellung freuen als Reaktion auf meinen Beitrag freuen.
Mit freundlichen Grüßen,
Eckard Klotz.
-
Ja, DWARF-2 (DW2) ist schneller als SJLJ (setjmp/longjmp).
Dafür kannst du mit SJLJ Exceptions durch Fremdcode durchwerfen, was mit DWARF-2 leider nicht geht.Ich waret allerdings immer noch auf eine Variante mit MSVC-kompatiblem Exception Handling. Wäre für nen Windows Compiler irgendwie angebracht.