Delphi 7,Windows NT服务,控制台应用程序

时间:2013-02-07 01:47:58

标签: performance delphi delphi-7

我有一个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;

1 个答案:

答案 0 :(得分:1)

事实证明,该问题与连接的使用和共享连接有关。

在启动CreateProcess之前,我采用了破坏调度程序连接的方法,内核使用情况与我从控制台直接运行时所看到的一致。

非常令人惊讶,因为连接甚至没有与命令行正在进行的共享。

未来参考:在说两种方法相同之前,一定要消除所有变量。在这方面,他们不是。调度程序有连接,控制台应用程序没有。这就完全不同了。