我有一个Delphi 7 32位应用程序。 Windows 7 64位。
一切都运行良好。我最近一直在调查我已经注意到的性能问题。
应用程序的简要概述 - >
有一个用Delphi编写的命令行/控制台应用程序可执行文件。这将创建一个多线程连接集并完成数据库工作。 用Delphi编写的NT服务(调用命令行应用程序),基于它找到的作业的时间表。这是通过调用我们的DLL来完成的,该DLL查找并执行命令行应用程序的CreateProcess,并完成WaitForSingleObject。实际上,此服务负责查找何时需要完成工作,并调用可执行/控制台应用程序来执行此操作。
这是我的问题,我似乎无法弄明白。
如果我运行命令行应用程序,我得到的结果大约比NT服务通过CreateProcess调用它快4倍。这是IDENTICAL代码。一个是DOS提示符发布EXE,另一个是NT服务,它加载一个DLL,然后为同一个可执行文件调用CreateProcess。
我要去香蕉。我看不出任何理由。
到目前为止,我可以在任何系统配置上重现这一点。
到目前为止我注意到的事情(不是科学的,但肯定是相关的)。
如果我使用CPU时间和内核时间监视CPU内核,则控制台应用程序在其执行的生命周期内只有一小部分内核时间。当调度程序服务运行时,内核时间占我获得的CPU%的50%-70 %%或更多。
一些实际结果(我认为其他一切都无关紧要) - 控制台应用程序,通过命令行运行:26秒 - 控制台应用程序,通过CreateProcess运行服务:113秒
是什么给出了?
我或许已经研究过FastMM没有被正确分享。我相信它是。我甚至把它取出来了。相同的异常。 我调查了FastCode,FastMove的东西不能在服务下工作(因为在启动时,它试图动态地挂钩/替换核心RTL函数。将它们从等式中移除,同样的异常。 我已经考虑删除我们修补的RTL(System.dcu / SysInit.dcu)文件。没有快乐。
一切都无济于事。
所以,我的问题(以及可能的原因征求意见)是......
NT服务是否排除了执行自动/挂钩替换功能的能力? Delphi服务是否会创建会导致此问题的内容? 是否有某种固有的开销 - (而且这是一个巨大的数额)与服务? 是否有其他人使用FastMM,FastCode,FastMove的替代品,因为这种性质的东西?
在此提前感谢任何指导/帮助。
以下是用于从NT服务启动应用程序的代码片段。
FillChar(si, SizeOf(si), 0);
si.dwFlags := SW_HIDE;
FillChar(pi, SizeOf(pi), 0);
sCommandLine := Format('"%s" "%d"', [ExtractFilePath(ParamStr(0)) + 'MYAPP.EXE', AJobID]);
If CreateProcess(PChar(sFilename),
PChar(sCommandLine),
Nil,
Nil,
False,
0,
Nil,
Nil,
si,
pi) Then Begin
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, ExitCode);
Result := (ExitCode = 0);
End Else Begin
AddEventLogMessage(SysErrorMessage(GetLastError));
End;
答案 0 :(得分:1)
事实证明,该问题与连接的使用和共享连接有关。
在启动CreateProcess之前,我采用了破坏调度程序连接的方法,内核使用情况与我从控制台直接运行时所看到的一致。
非常令人惊讶,因为连接甚至没有与命令行正在进行的共享。
未来参考:在说两种方法相同之前,一定要消除所有变量。在这方面,他们不是。调度程序有连接,控制台应用程序没有。这就完全不同了。