Prozessausführung wegen unnötiger DLL-Lookups langsam

931
erik

Ich habe Leistungsprobleme mit einem kleinen Programm, das manchmal sehr häufig auf einer Maschine gestartet wird. Es ist ein 32-Bit-Programm, das auf einer 64-Bit-Maschine ausgeführt wird. Es heißt im_comp.exe und wird normalerweise platziert und ausgeführt von:

C:\Program Files (x86)\TESLA\bin 

Wenn ich dieses Programm 150 Mal von diesem Ort aus ausführen lasse, dauert es 15 Sekunden, aber wenn ich den bin-Ordner auf den Desktop kopiere und von dort aus ausführe, dauert es nur 10 Sekunden (es ist jedes Mal ~ 30% schneller.) ohne ausnahmen). Ich dachte mir, dass dies etwas damit zu tun hat, wo der Prozess seine DLLs lädt, so dass der Pfad von allem, was mit TESLA zu tun hat, gelöscht wurde und das spielt keine Rolle. Dann habe ich den Prozessmonitor auf einer einzelnen Ausführung ausgeführt und einen klaren Unterschied festgestellt. In dem Protokoll, in dem das Programm von C: \ Program Files (x86) \ TESLA \ bin aus ausgeführt wurde, gibt es viele Einträge, die diesem Muster folgen:

CreateFile C:\Program Files (x86)\TESLA\bin\im_comp.exe.Local\wow64.dll PATH NOT FOUND Desired Access: ... CreateFile C:\Program Files (x86)\TESLA\bin\wow64.dll NAME NOT FOUND Desired Access: ... CreateFile C:\Windows\System32\wow64.dll SUCCESS Desired Access: ... 

Diese Einträge fehlen vollständig im Protokoll, wenn ich vom Desktop aus laufe.

Nun befinden sich .Local-Dateien sowohl im Desktop-Bin-Ordner als auch im anderen. Selbst wenn ich alle .Local-Dateien aus den Ordnern entferne, erhalte ich immer noch die gleichen Protokollmuster.

Warum versucht der Prozess, auf DLL-Dateien im lokalen Verzeichnis zuzugreifen, obwohl keine .Local-Dateien vorhanden sind? Ist dies ein Problem, das auf dem Programm selbst oder der Umgebung basiert? Gibt es eine Möglichkeit, es auszuschalten, vorzugsweise ohne es zu verschieben, da es Teil einer größeren Anwendung ist.

0
Haben Sie die gleiche Geschwindigkeit "Gewinn", wenn Sie "C: \ Programme (x86)" vs. "C: \ Programme" verwenden? 0xC0000022L vor 12 Jahren 0
Ja, in der Tat scheint es, wenn ich den bin-Ordner irgendwo ablege, aber wo er installiert ist, bekomme ich die Geschwindigkeitssteigerung. erik vor 12 Jahren 0
Nun, für mich klingt das mehr nach einer WOW64-Ausgabe als nach allem anderen. Es gibt spezielle Semantiken für `C: \ Program Files (x86)`. 0xC0000022L vor 12 Jahren 0

1 Antwort auf die Frage

1
LawrenceC

Ich glaube, das ist beabsichtigt.

Microsoft erlaubt Entwicklern die Weitergabe von Komponenten / DLLs, die mit Visual Studio geliefert werden, wie z. B. mit Visual Basic zusammenhängende Laufzeiten usw. Es ist daher für viele Windows-Programme nicht untypisch, bestimmte DLL-Versionen in ihren eigenen Anwendungsverzeichnissen zu verwenden. und müssen diese Version über eine neuere Version verwenden, die möglicherweise auf dem System installiert ist.

Ich habe die Vermutung, dass Windows während der Installation Programmdateinamen bekannten .dll-Speicherorten zuordnen kann (dies kann sogar Teil des "Superfetch" -Dienstes sein) und daher nicht danach suchen oder gar vorladen. Ich wette, so etwas geht weiter. Nicht sicher, wie man es ausschaltet.

Bedeutet Ihr letzter Absatz nicht, dass das Programm vom Installationsverzeichnis aus schneller ausgeführt wird als vom Desktop und nicht umgekehrt? erik vor 12 Jahren 0
Ich habe Ihre Frage tatsächlich noch einmal gelesen und festgestellt, was Sie gesagt haben ... Vielleicht ist es ein von den Windows-Entwicklern eingefügter Hack, um das Testen zu beschleunigen oder so. Bizzare LawrenceC vor 12 Jahren 0