Ich habe folgendes Setup:
Was ist unerwartet:
Quellcode der Delphi-Befehlszeilenanwendung:
%Vor%C dll Quellcode:
%Vor%Delphi + C dll Quellcode: DelphiCpplibraryCall.zip
Laufzeitvergleich:
Aus irgendeinem Grund scheint der Delphi-Debugger den Aufruf der C-DLL-Funktion zu verlangsamen, was das Debugging nahezu unmöglich macht.
Hat jemand eine Ahnung, was könnte dieses Problem oder wie man es vermeiden? Vielen Dank.
Bearbeiten: Ich kann jetzt bestätigen, dass das beschriebene Verhalten nicht auf die Delphi IDE und den Debugger beschränkt ist. Dieses Problem tritt auch auf, wenn ich:
Dies bedeutet, dass sich die Ausführungszeit für die Build-Funktion der C dll-Version ändert, je nachdem, ob ein Debugger angeschlossen ist oder nicht.
Ich kann auch bestätigen, dass das Löschen der unordered_map ( delete values;
) so lange dauert, bis ein Debugger vorhanden ist.
Wenn die Verzögerung vom Aufruf delete
stammt, kann der Speichermanager (malloc) den Windows-Heap-Speichermanager verwenden. Der Heapspeicher-Manager führt zusätzliche umfangreiche Prüfungen durch, wenn Speicher freigegeben wird und ein Debugger angeschlossen ist.
Diese zusätzlichen Prüfungen können deaktiviert werden, indem die Umgebungsvariable _NO_DEBUG_HEAP
auf 1
gesetzt wird (beginnt mit einem Unterstrich).
Sie können dies in Delphi für ein bestimmtes Projekt unter Project/Options.../Debugger/Environment Block
tun oder Sie können _NO_DEBUG_HEAP
zum Umgebungsblock des Benutzers unter Control Panel/System Properties/Advanced System Settings/Environment Variables/System Variables
hinzufügen, damit es für alle Projekte und alle Anwendungen funktioniert. Aber dann müssen Sie möglicherweise abmelden, um die Änderungen zu übernehmen oder zumindest die IDE neu zu starten.
Dies scheint ein Problem mit der MSVC-Implementierung dieses STL-Containers zu sein. Wenn Sie den Visual Studio-Debugger verwenden, kann genau dasselbe Verhalten angezeigt werden. Die MSVC-Laufzeit wechselt das Verhalten, wenn sie einen Debugger erkennt.
Ich habe die folgenden Links gefunden, die sich auf dieses Problem beziehen:
Ein großer Teil des Problems scheint die Leistung beim Löschen der Karte zu sein. Entfernen Sie einfach die Zeile delete
aus Ihrem C ++ - Code, um die Leistung erheblich zu verbessern.
Ich kann keine brauchbare Lösung für dieses Problem finden.
Tags und Links c++ dll delphi performance msvc12