由于不必要的 dll 查找导致进程执行缓慢

由于不必要的 dll 查找导致进程执行缓慢

我在一台机器上遇到了一个小程序的性能问题,它有时会非常频繁地启动。这是一个在 64 位机器上运行的 32 位程序。它被称为 im_comp.exe,通常放置在以下位置并运行:

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

现在,如果我从此处运行该程序 150 次,则需要 15 秒,但如果我将 bin 文件夹复制到桌面并从那里运行它,则只需要 10 秒(每次都快约 30%,没有例外)。我认为这可能与进程从何处加载其 dll 有关,因此清除了与 TESLA 相关的任何路径,这并不重要。然后,我在一次执行中运行了进程监视器,发现了明显的差异。在从 C:\Program Files (x86)\TESLA\bin 运行程序时的日志中,有很多条目遵循此模式:

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: ...

当我从桌面运行时,这些条目在日志中完全消失。

现在,桌面 bin 文件夹和另一个文件夹中都有 .Local 文件。即使我从文件夹中删除所有 .Local 文件,我仍然会得到相同的日志模式。

为什么即使没有 .Local 文件,进程也会尝试访问本地目录中的 dll 文件?这是基于程序本身还是环境的问题?有没有办法关闭它,最好不要移动它,因为它是较大应用程序的一部分。

答案1

我相信这是设计使然。

微软允许开发人员重新分发 Visual Studio 附带的组件/.dll,例如 Visual Basic 相关的运行时等。因此,许多 Windows 程序在其自己的应用程序目录中拥有它们所依赖的 .dll 的特定版本,并且需要使用该版本而不是系统上可能安装的更高版本,这并不罕见。

我有一种预感,在安装过程中,Windows 可以将程序文件名映射到已知的 .dll 位置(这甚至可能是“Superfetch”服务的一部分),因此不会搜索它们,甚至不会预加载它们。我敢打赌肯定有这样的事情发生。不过,不知道如何关闭它。

相关内容