' schrieb:Folgende Problemstellung:
Ich habe ein Beispielcode des Herstellers einer Bibliothek genommen, in ein C++ Projekt gepackt und als exe kompiliert. Der Code arbeitet sauber und am wichtigsten sehr schnell. Danach kompiliere ich den gleichen Code als dll und der Code arbeitet immernoch sauber, aber um einiges langsamer. Ich weiß allerdings das es keinen unterschied in der Ausfürhungsgeschwindigkeit zwischen exe und dll geben dürfte. Wie kann ich also eine dll in der geschwindikeit optimieren. Ich arbeite mit VS 2008 und weiß das es bestimmte Compiler-Schalter gibt (auf Geschwindigkeit optimierter Code...), die aber allesamt versagen. Hat jemand ein ähnliches Problem lösen können, oder irgendwelche Ideen?
Danke, eure abrissbirne
Ohne den Code zu sehen lässt sich hier eigentlich gar nichts sagen. Das könnte an sehr viel Dingen liegen. Beispielsweise daran, dass ein C(++) Executable grundsätzlich single threaded ist, ausser Du machst Dir grosse Mühe im C Code selber.
Die DLL innerhalb von LabVIEW, läuft in einem Multithreaded System, da LabVIEW mit ziemlich vielen Threads aufgestartet wird. Wie wird denn die DLL Funktion aufgerufen? Innerhalb des UI Threads oder als Reentrant?
Wenn Du sie im UI Thread laufen lässt muss sich der DLL Code die CPU mit dem ganzen LabVIEW UI System teilen, der ausser zum Updaten des User Interfaces auch für allerlei Synchronisationsaufgaben zwischen verschiedenen beschützten Subsystemen verantwortlich ist.
Aber man kann nicht einfach eine Funktion reentrant konfigurieren wenn die nicht auch explizit dafür programmiert wurde. Dazu sollte sie grundsätzlich keinerlei globale Variablen ansprechen und auch nicht ohne Schutz (Semaphore oder ähnliches) auf externe Resourcen wie Hardwareschnittstellen etc zugreifen.
Aber selbst wenn Du die DLL korrekt reentrant ausführst wird sich der entsprechende Thread die CPU mit anderen Threads innerhalb von LabVIEW teilen müssen und wird wahrscheinlich ein wenig langsamer laufen als in einem single threaded Executable.
Rolf Kalbermatter