我们正在用Delphi 7开发一个控制台软件。
为了简化,该软件使用嵌入式TCP服务器来响应来自CGI的外部请求。这些答案包含生成的带有Teechart图形的HTML页面,以及使用DbExpress从数据库中提取的数据。
在Windows 7和Windows2008 R2服务器上,我们注意到我们软件的运行时间显著增加--是Windows或Windows 2003上原始进程时间的2或3倍--在执行的标准上下文中:系统用户帐户启动的软件作为服务启动。
但是,当我们的软件以简单用户的身份、从命令提示符或直接从IDE (调试模式)启动时,问题就会消失。
我的第一个问题是:有人注意到这个问题了吗?
使用ProcessExplorer时,我们还注意到当软件作为服务启动时,既没有创建GDI句柄,也没有创建用户句柄。但是当使用用户帐户启动该软件时,会创建其中的一些句柄。使用Windows和Windows 2003,软件要么作为服务启动,要么以简单的用户帐户启动,这些句柄总是被创建的。
这个观察能和我们的问题联系起来吗?
如果你已经注意到这些行为,你是如何解决这个问题的?
发布于 2012-09-27 07:18:14
我想我们找到了问题的根源。因此,对于那些正在寻找解决方案的人,下面是我们所做的:
延迟是由于使用局部变量使用Win32 API函数造成的。现在建议使用地区标识符函数来支持使用Locale函数(请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd319091%28v=vs.85%29.aspx)。
我们的开发显着地使用了“CompareString”(http://msdn.microsoft.com/en-us/library/windows/desktop/dd317759%28v=vs.85%29.aspx),包括在用户上下文系统(会话0)中运行时,该方法的TStringList .The执行(CompareStringA of kernell32)的indexOf方法的使用速度减慢。
为了解决这个问题,我们用CompareStr而不是CompareString过载了CompareStr。这个解决方案适用于我们的上下文,但是CompareStr进行逐位比较,不像CompareString那样区分大小写。(更不用说这种方法快10倍. http://www.gefvert.org/blog/archives/651)
另一个解决方案是改用新版本的IDE,但我们都知道这是另一个故事.
发布于 2013-01-06 05:32:31
由于我们依赖Windows函数的地方很多,所以我们无法用非Windows版本来代替它。但是,我们发现这个API没有通过使用LOCAL_USER_DEFAULT ($07)来使用LOCALE_INVARIANT,而是运行得很好。因此,我们决定破解Windows中定义的常量值,并在用于比较的任何地方对其进行写入,并进行如下条件编译:
{$IFDEF OVERLOAD_LUD}
const
LOCALE_INVARIANT = $7;
LOCALE_USER_DEFAULT = LOCALE_INVARIANT;
{$ENDIF}解决了问题。
https://stackoverflow.com/questions/12349922
复制相似问题