MidasLib.dcu使应用程序变慢

时间:2013-03-16 12:40:10

标签: delphi tclientdataset

我在一些客户端声明MidasLib以避免由Midas.dll引起的dll地狱。

以下代码运行时间约为2350毫秒。如果我在使用中删除了MidaLib声明,它将在45毫秒内开始运行!!

data.xml文件使用TClientDataSet.SaveToFile方法保存,有5000条记录,大小约为600Kb。

有人知道如何解释这种奇怪的行为吗?

我可以在Delphi XE2 upd 3和Delphi XE3 upd 2中确认问题。

感谢。

program Loader;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  MidasLib,
  System.SysUtils,
  Winapi.Windows,
  Data.DB,
  Datasnap.DBClient;

var
  cds : TClientDataSet;
  start, stop : Cardinal;
begin
  cds := TClientDataSet.Create(nil);
  try
    start := GetTickCount;
    cds.LoadFromFile('c:\temp\data.xml');
    stop := GetTickCount;
    Writeln(Format('Time elapsed: %dms', [stop-start]));
  finally
    cds.Free;
  end;
end.

3 个答案:

答案 0 :(得分:6)

这是一个已知的错误/回归,请参阅质量控制报告

答案 1 :(得分:1)

我们只使用Midas DLL的本地副本,无论系统中安装了什么,只有在找不到本地版本时才会回退到全局版本。

我们使用XE2 upd4 hf1然后我们切换到XE4的Midas DLL(主项目仍然用xe2制作)

git config log.decorate none

答案 2 :(得分:0)

我不确定为什么你认为你需要使用MidasLib来避免DLL地狱"。

当RTL调用TCustomClientDataSet.CreateDSBase时,会在DSIntf.Pas中调用CheckDbClient。正是这个例程通过检查注册表来确定加载了哪个Midas.Dll实例。

因此,您可以通过确保注册表在调用CheckDbClient之前反映其位置来确保使用Midas.Dll的特定实例。注册表设置为InProcServer32下的HK_Classes_Root\CLSId\{9E8D2FA1-591C-11D0-BF52-0020AF32BD64}。当然,可以通过调用RegisterComServer指定Midas路径和文件名来更新它,但必须符合必要的注册表访问权限。