我的程序有几个工作线程调用动态加载的DLL文件中的函数。性能比调用EXE文件中的函数要慢。我的程序是用Delphi编写的。我不使用ShareMM。 DLL中的函数有许多例程可以将文件读入内存。使用的调用约定是stdcall。实际上,速度很差!
我不知道因为我刚刚学会了使用DLL。那么我该怎么做才能优化程序/ DLL的性能/速度呢?
很抱歉,如果我的问题没有意义。我确信我的exe没有任何问题,我只是将我的函数移动到DLL中,性能变慢了。请忽略磁盘/内存缓存因子,因为我已经提到过我的DLL的例程。
编辑:
这是我的程序加载DLL的方式
DLLHandle := LoadLibrary(pwchar(path));
if DLLHandle <> 0 then
@CheckFile := GetProcAddress(DLLHandle, 'CheckFile');
在我的工作线程中,我总是使用if Assigned(CheckFile) then
检查函数,然后调用CheckFile函数。
这里是我的功能说明
type
TCheckFile = function(const FileName: string; var FileType: WideString)
: Boolean; stdcall;
var
CheckFile: TCheckFile ;
现在,DLL中的代码
function CheckFile(const FileName: string; var FileType: WideString)
: boolean; stdcall;
var
testCheckFile: TBla;
begin
Result := false;
testCheckFile := TBla.Create;
try
if testCheckFile.DoSomeRoutine(FileName, FileType) then
Result := true;
finally
testCheckFile.Free;
end;
end;
exports CheckFile;
begin
IsMultiThread := true;
end.
我的DLL做什么?它与TFileStream一起播放,如将文件转换为指针。
我希望我的加载代码和调用代码有问题。
答案 0 :(得分:1)
驻留在DLL中的代码的运行速度与驻留在主机可执行文件中的代码的运行速度相同。将代码移动到DLL将极不可能导致性能明显下降。
但是,您在评论中指出您已从Delphi 2007移植到Delphi XE2。这几乎可以肯定是导致性能下降的变化。
在衡量和比较表现时,一次改变一件事是至关重要的,这样就可以消除混淆因素的任何可能性。
答案 1 :(得分:0)
可能问题与:“动态加载的DLL文件”有关。动态是可以的,但是一旦你加载它,保持它正确加载?如果你为每个函数调用继续加载/卸载,它会变慢(在调试器中慢很多!)