8

私は次の設定をしています:

  1. Delphi XE5 で記述され、Debug 64 ビットでビルドされた Delphi コマンド ライン アプリケーション。
  2. Microsoft Visual Studio 2013 で記述され、リリース 64 ビットに組み込まれた AC dll。
  3. Delphi コマンド ライン アプリケーションは、C dll の関数を呼び出します。

予想外のこと:

  1. Delphi XE5 IDE 内で Delphi コマンド ライン アプリケーションをデバッグする場合、C dll 関数の呼び出しに 15 秒かかります。
  2. 同じ 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 とデバッガーにまったく制限されていないことを確認できます。この問題は、次の場合にも発生します。

  1. Release の Microsoft Visual Studio 2013 で C dll をビルドします。
  2. そして、Visual Studio 2013 で C dll を呼び出すコマンド ライン実行可能ファイルをビルドしてデバッグします。

つまり、C dll リリース ビルド関数の実行時間は、デバッガが接続されているかどうかによって異なります。

delete values;また、デバッガーが存在するとすぐに時間がかかるのは unordered_map ( ) の削除であることも確認できます。

4

2 に答える 2