我有一个程序,我在多台网络PC上运行。当我编译最新版本时,它在网络上的2台PC上运行速度非常慢,但对其他人来说运行正常。
当我安装了额外的2GB RAM时,我的旧开发PC就会发生这种情况。当我删除额外的2gb并重新编译时,它将适用于所有人。
现在,我正在使用一台全新的机器并遇到同样的问题。我在重新启动后尝试重建项目,但仍然遇到同样的问题。
对于所有其他PC,程序加载大约3-5秒。在这两台PC上,加载时需要45秒到1.5分钟......
其中一台PC是较旧的Dell Dimension 8200,但另一台PC是较新的OptiPlex,它与网络上的其他几台PC完全相同,所以这才真正让它变得如此混乱。
现在,我不得不恢复旧版本,以便它能够为每个人正确运行。
有没有人想知道要尝试什么?
提前致谢!!!
编辑:
好的,昨天是一个疲惫的一天,尝试各种方法来解决这个问题。以下是我尝试过的问题以及问题的开始:
使用新程序
回到所有更新组件的旧版本,但仍有相同的问题
使用旧程序
我决定回到绘图板,从旧版本的应用程序开始,逐步添加新功能。
好的,现在我们知道我更新的组件集没有任何内容......
因此,只在应用程序中添加一个表单就是导致问题的原因!我删除了表单打开的所有代码,注释掉了uses子句并从项目源中删除了uses条目,一切恢复正常!
有人对此有任何想法吗?
谢谢!
编辑2:
对于@Warren P - 这是我的.DPR来源:
program Scheduler;
uses
ExceptionLog,
Forms,
SchedulerMainUnit in 'SchedulerMainUnit.pas' {FrmMain},
SchedulerDBInfoUnit in 'SchedulerDBInfoUnit.pas' {FrmDBInfo},
SchedulerHistoryUnit in 'SchedulerHistoryUnit.pas' {FrmHistory},
SchedulerOptionsUnit in 'SchedulerOptionsUnit.pas' {FrmOptions},
SchedulerExtVersionUnit in 'SchedulerExtVersionUnit.pas' {FrmExtVersion},
SchedulerSplashUnit in 'SchedulerSplashUnit.pas' {FrmSplash},
SchedulerInfoUnit in 'SchedulerInfoUnit.pas' {FrmInfo},
SchedulerShippedUnit in 'SchedulerShippedUnit.pas' {FrmShipped}; {<-- This is the new form with the issue}
{$R *.res}
begin
Application.Initialize;
Application.Title := 'SmartWool WIP Scheduling Assistant';
Application.CreateForm(TFrmMain, FrmMain);
Application.CreateForm(TFrmDBInfo, FrmDBInfo);
Application.CreateForm(TFrmHistory, FrmHistory);
Application.CreateForm(TFrmOptions, FrmOptions);
Application.CreateForm(TFrmExtVersion, FrmExtVersion);
Application.Run;
end.
这是创建启动的主窗体的初始化部分:
initialization
FrmSplash:=TFrmSplash.Create(Application);
FrmSplash.Show;
FrmSplash.Refresh;
编辑3:
任何人???请?
答案 0 :(得分:12)
当尝试访问该计算机上不可用的资源(例如网络驱动器或Internet主机)时,程序可能正在等待超时。
在启动程序时尝试运行 Process Monitor 并查找文件打开的调用。过滤输出,使其仅显示您的过程。
答案 1 :(得分:6)
最初的性能问题最初看起来非常令人生畏。
我参加了许多团队,人们试图猜测性能问题的原因。这有时会起作用,但远不如实际测量代码那么有效。
在开发机器上可重现时,我会推荐一个分析器。
之前有一个问题要问 Delphi Profiling tools有几种可以使用的工具。
当您无法在开发计算机上重现问题时,它会变得有点困难,但并非不可能。通常我发现问题与不同的应用程序依赖关系有关,并且表现不佳。了解对应用程序的外部影响可以帮助查明问题。
我的一些应用中特别常见的外部问题。
监控与网络相关的项目(即数据库,Web服务等...) 我通常使用Wireshark来查看资源是否在预期时间内响应。我最常见的问题是DNS效果不佳,可以使用Wireshark找到。
您可以使用AutoRuns程序来确定计算机启动时启动的所有内容,它可用于确定计算机之间的差异。
但最重要的是我的日志记录可以在我的应用程序中打开,这使我可以将问题隔离到特定的代码区域。缩小到特定代码部分可以减少猜测,并且可以让您专注于一些可能的问题。
答案 2 :(得分:4)
我为此创建了一个日志函数,我在特定的地方调用(特别是在启动时)。它为每个日志文本添加时间戳,并将它们存储在定期保存的TMemo中。调试时不仅非常有用,而且还可以解决您的问题。
答案 3 :(得分:2)
您使用的是代码签名 - 即Microsoft Authenticode吗?如果是这样,那么计算机上过时的证书颁发机构可能会导致启动时出现严重延迟。
答案 4 :(得分:2)
首先,我会尝试对硬盘进行碎片整理。如果仍然很慢,我会检查电源。也许你的硬盘能量不足。
答案 5 :(得分:2)
创意1:
我看到非常慢的应用程序加载时间的一个原因是,在您的应用程序中打印或报告Developer Express Express等系统组件时。
使用Developer Express Printing组件时遇到的问题是我的打印机列表(检查控制面板打印机图标)中没有响应的离线或无响应网络打印机。其中一些Developer Express组件似乎从您安装的每台打印机中读取了一些信息,解决方案是转到这些客户端,并从控制面板中删除不再使用的旧打印机。每个无响应的网络打印机为TCP超时添加最多60秒,到我的应用程序的启动时间。
更新 - 理念2:
下载MS DebugView并将其安装在运行缓慢的计算机上。现在返回主开发PC,打开IDE,打开主项目文件(右键单击项目,在项目查看器中查看项目源),这将显示主项目源文件(.dpr)的内容。去主要的开始....结束。块。现在在主begin语句上设置断点,然后单步INTO(不是OVER),您将看到所有模块初始化部分。在每一个中添加:OutputDebugString('ModuleName')。
现在,当您在Delphi Ide中运行它时,您将看到消息,并查看它们之间的距离,并了解需要很长时间才能初始化的内容。而不是将delphi ide安装到运行缓慢的机器上,将运行Debug View(小于400kb的单个可执行文件),它将显示这些调试消息,以及良好的时间显示(##。#seconds)对于每条消息。
答案 6 :(得分:2)
答案 7 :(得分:1)
您是否允许在DPR源中初始化时构建表单?如果是这样,你可能会考虑是否希望这些表单在整个时间内消耗内存,如果你希望那些表单浪费应用程序的加载时间,那就更好了。
经验法则:如果在应用程序执行期间使用了表格,则允许在应用程序加载时构建表单(这将比在“按需”构建实例时更快地解决)。 如果表单根本没有经常使用(例如,对话框或关于框),请从DPR源删除“Application.CreateForm”行,而是根据请求构建您的实例...
var
LForm: TfrmAbout;
begin
Application.CreateForm(LForm, TfrmAbout);
try
LForm.ShowModal;
finally
LForm.Free;
end;
end;
现在,该表单(在程序执行期间甚至可能无法显示)不会占用系统资源,也不会减慢应用程序的加载时间。
它可能无法100%解决您的问题,但它肯定会有所帮助!