程序在几台计算机上运行缓慢

时间:2011-04-06 11:27:23

标签: performance delphi

我有一个程序,我在多台网络PC上运行。当我编译最新版本时,它在网络上的2台PC上运行速度非常慢,但对其他人来说运行正常。

当我安装了额外的2GB RAM时,我的旧开发PC就会发生这种情况。当我删除额外的2gb并重新编译时,它将适用于所有人。

现在,我正在使用一台全新的机器并遇到同样的问题。我在重新启动后尝试重建项目,但仍然遇到同样的问题。

对于所有其他PC,程序加载大约3-5秒。在这两台PC上,加载时需要45秒到1.5分钟......

其中一台PC是较旧的Dell Dimension 8200,但另一台PC是较新的OptiPlex,它与网络上的其他几台PC完全相同,所以这才真正让它变得如此混乱。

现在,我不得不恢复旧版本,以便它能够为每个人正确运行。

有没有人想知道要尝试什么?

提前致谢!!!


编辑:

好的,昨天是一个疲惫的一天,尝试各种方法来解决这个问题。以下是我尝试过的问题以及问题的开始:

使用新程序

回到所有更新组件的旧版本,但仍有相同的问题

使用旧程序

我决定回到绘图板,从旧版本的应用程序开始,逐步添加新功能。

  1. 使用旧组件重新编译旧版本 - 程序运行正常
  2. 更新到新的DevExpress组件 - 程序运行正常
  3. 更新为新的ESBPCS组件 - 程序运行正常
  4. 更新为新的DeepSoftware组件 - 程序运行正常
  5. 好的,现在我们知道我更新的组件集没有任何内容......

    1. 为2个图像列表中的每一个添加了1张图像 - 程序运行正常
    2. 添加了新的数据库表 - 程序运行正常
    3. 添加了打开和关闭新表的代码 - 程序运行正常
    4. 向操作列表添加了新操作,并为新操作添加了菜单项和工具栏按钮(此时操作无效) - 程序运行正常
    5. 向应用程序添加了新的BLANK表单,并添加了代码以打开新表单 - BAM !!!
    6. 因此,只在应用程序中添加一个表单就是导致问题的原因!我删除了表单打开的所有代码,注释掉了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:

      任何人???请?

8 个答案:

答案 0 :(得分:12)

当尝试访问该计算机上不可用的资源(例如网络驱动器或Internet主机)时,程序可能正在等待超时。

在启动程序时尝试运行 Process Monitor 并查找文件打开的调用。过滤输出,使其仅显示您的过程。

http://technet.microsoft.com/en-us/sysinternals/bb896645

答案 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)对于每条消息。

MS Debug view is here.

答案 6 :(得分:2)

  1. 检查这两台有问题的计算机上是否有相同的防病毒软件。如果是这样,那么您的Delphi应用程序可能会匹配Delphi中生成的某些病毒中使用的字节模式。更新病毒定义以解决问题,或向防病毒公司报告虚假警报,或更改防病毒软件。
  2. 检查这两台有问题的计算机上是否安装了任何打印机。如果是这样,则添加任何打印机,然后重试。

答案 7 :(得分:1)

您是否允许在DPR源中初始化时构建表单?如果是这样,你可能会考虑是否希望这些表单在整个时间内消耗内存,如果你希望那些表单浪费应用程序的加载时间,那就更好了。

经验法则:如果在应用程序执行期间使用了表格,则允许在应用程序加载时构建表单(这将比在“按需”构建实例时更快地解决)。 如果表单根本没有经常使用(例如,对话框或关于框),请从DPR源删除“Application.CreateForm”行,而是根据请求构建您的实例...

var
  LForm: TfrmAbout;
begin
  Application.CreateForm(LForm, TfrmAbout);
  try
    LForm.ShowModal;
  finally
    LForm.Free;
  end;
end;

现在,该表单(在程序执行期间甚至可能无法显示)不会占用系统资源,也不会减慢应用程序的加载时间。

它可能无法100%解决您的问题,但它肯定会有所帮助!

相关问题