首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows 7&Windows 2008 R2:运行时显著增加

Windows 7&Windows 2008 R2:运行时显著增加
EN

Stack Overflow用户
提问于 2012-09-10 10:36:38
回答 2查看 1.7K关注 0票数 2

我们正在用Delphi 7开发一个控制台软件。

为了简化,该软件使用嵌入式TCP服务器来响应来自CGI的外部请求。这些答案包含生成的带有Teechart图形的HTML页面,以及使用DbExpress从数据库中提取的数据。

在Windows 7和Windows2008 R2服务器上,我们注意到我们软件的运行时间显著增加--是Windows或Windows 2003上原始进程时间的2或3倍--在执行的标准上下文中:系统用户帐户启动的软件作为服务启动。

但是,当我们的软件以简单用户的身份、从命令提示符或直接从IDE (调试模式)启动时,问题就会消失。

我的第一个问题是:有人注意到这个问题了吗?

使用ProcessExplorer时,我们还注意到当软件作为服务启动时,既没有创建GDI句柄,也没有创建用户句柄。但是当使用用户帐户启动该软件时,会创建其中的一些句柄。使用Windows和Windows 2003,软件要么作为服务启动,要么以简单的用户帐户启动,这些句柄总是被创建的。

这个观察能和我们的问题联系起来吗?

如果你已经注意到这些行为,你是如何解决这个问题的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,但我们都知道这是另一个故事.

票数 0
EN

Stack Overflow用户

发布于 2013-01-06 05:32:31

由于我们依赖Windows函数的地方很多,所以我们无法用非Windows版本来代替它。但是,我们发现这个API没有通过使用LOCAL_USER_DEFAULT ($07)来使用LOCALE_INVARIANT,而是运行得很好。因此,我们决定破解Windows中定义的常量值,并在用于比较的任何地方对其进行写入,并进行如下条件编译:

代码语言:javascript
运行
复制
{$IFDEF OVERLOAD_LUD}
const
  LOCALE_INVARIANT = $7;
  LOCALE_USER_DEFAULT = LOCALE_INVARIANT;
{$ENDIF}

解决了问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12349922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档