gpt4 book ai didi

c++ - Delphi:使用调试器调用 C dll 函数需要 15 秒,没有调试器需要 0.16 秒。为什么?

转载 作者:可可西里 更新时间:2023-11-01 17:44:55 25 4
gpt4 key购买 nike

我有以下设置:

  1. 用 Delphi XE5 编写并内置 Debug 64 位的 Delphi 命令行应用程序。
  2. 用 Microsoft Visual Studio 2013 编写并内置 64 位版本的 C 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源代码:DelphiCpplibraryCall.zip

运行时比较:

  • 第一个控制台:在 IDE 中调试时
  • 第二个控制台:在没有 IDE 的情况下启动

Runtime comparison

出于某种原因,Delphi 调试器似乎大大减慢了 C dll 函数调用的速度,这使得调试几乎不可能。

有没有人知道什么可能导致这个问题或如何避免它?非常感谢。

编辑:我现在可以确认所描述的行为根本不限于 Delphi IDE 和调试器。如果我:

  1. 我在 Microsoft Visual Studio 2013 Release 中构建 C dll。
  2. 并在 Visual Studio 2013 中构建和调试调用 C dll 的命令行可执行文件。

这意味着 C dll 发布构建函数的执行时间会根据是否附加调试器而变化。

我还可以确认,只要存在调试器,删除 unordered_map(delete values;)就需要这么长时间。

最佳答案

如果延迟来自 delete 调用,则它可能是使用 Windows 堆内存管理器的内存管理器 (malloc)。当释放内存并附加调试器时,堆内存管理器会执行额外的广泛检查。

可以通过将环境变量 _NO_DEBUG_HEAP 设置为 1(以下划线开头)来禁用这些额外的检查。

您可以在 Delphi 中针对 Project/Options.../Debugger/Environment Block 下的特定项目执行此操作,或者您可以将 _NO_DEBUG_HEAP 添加到用户的环境 block Control Panel/System Properties/Advanced System Settings/Environment Variables/System Variables 因此它适用于所有项目和所有应用程序。但随后您可能需要注销以应用更改或至少重新启动 IDE。

Delphi Project Options Environment Block

关于c++ - Delphi:使用调试器调用 C dll 函数需要 15 秒,没有调试器需要 0.16 秒。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com