私は次の設定をしています:
- Delphi XE5 で記述され、Debug 64 ビットでビルドされた Delphi コマンド ライン アプリケーション。
- Microsoft Visual Studio 2013 で記述され、リリース 64 ビットに組み込まれた AC dll。
- Delphi コマンド ライン アプリケーションは、C dll の関数を呼び出します。
予想外のこと:
- Delphi XE5 IDE 内で Delphi コマンド ライン アプリケーションをデバッグする場合、C dll 関数の呼び出しに 15 秒かかります。
- 同じ Delphi コマンド ライン アプリケーションを直接(IDE やデバッガを使用せずに)起動すると、C dll 関数の呼び出しに 0.16 秒かかります。
Delphi コマンド ライン アプリケーションのソース コード:
program DelphiCpplibraryCall;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Windows;
type
TWork = function(Count : Integer) : Integer; cdecl;
var
Handle : THandle;
Work : TWork;
Result : Integer;
Freq : Int64;
Start : Int64;
Stop : Int64;
begin
try
Handle := LoadLibraryEx('worker.dll', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
Work := GetProcAddress(Handle, 'work');
QueryPerformanceFrequency(Freq);
QueryPerformanceCounter(Start);
Result := Work(500000);
QueryPerformanceCounter(Stop);
Writeln(Format('Result: %d Time: %.6f s', [Result, (Stop-Start) / Freq]));
FreeLibrary(Handle);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
C dll ソース コード:
#include "worker.h"
#include <unordered_map>
class Item
{
public:
Item(const int value = 0) : _value(value) {}
virtual ~Item(void) {}
private:
int _value;
};
int work(int count)
{
typedef std::unordered_map<int, Item> Values;
Values* values = new Values;
int k = 0;
for (size_t i = 0; i < count; i++)
{
(*values)[i] = Item(i);
k++;
}
delete values;
return k;
}
Delphi + C dll ソース コード: DelphiCplibraryCall.zip
ランタイム比較:
- 最初のコンソール: IDE でデバッグする場合
- 2 番目のコンソール: IDE なしで起動する場合
何らかの理由で、Delphi Debugger は C dll 関数の呼び出しを大幅に遅らせ、デバッグをほとんど不可能にしているようです。
この問題の原因や回避方法を知っている人はいますか? どうもありがとう。
編集:説明されている動作が Delphi IDE とデバッガーにまったく制限されていないことを確認できます。この問題は、次の場合にも発生します。
- Release の Microsoft Visual Studio 2013 で C dll をビルドします。
- そして、Visual Studio 2013 で C dll を呼び出すコマンド ライン実行可能ファイルをビルドしてデバッグします。
つまり、C dll リリース ビルド関数の実行時間は、デバッガが接続されているかどうかによって異なります。
delete values;
また、デバッガーが存在するとすぐに時間がかかるのは unordered_map ( ) の削除であることも確認できます。