gpt4 book ai didi

c# - 具有许多 C++ 互操作调用的自动 C# 垃圾收集器性能不佳

转载 作者:太空狗 更新时间:2023-10-29 23:50:50 25 4
gpt4 key购买 nike

当放置良好的 GC.Collect 解决问题时,是什么导致 C# 垃圾收集在我的 C# 应用程序中执行大量 C++ 调用时如此悲惨地失败?我的 C# 应用程序使用 System.Runtime.InteropServices DllImport 和 CallingConvention.Cdecl 进行数百万次 C++ 调用,并且有一些 C# 析构函数来释放一些 C++ 非托管内存。我正在使用 .NET Framework 4。

  1. 什么会导致我的应用程序中的以下代码强制进行分页,从而减慢爬行的执行速度(在我的 32 GB 系统上消耗 29GB RAM,并且在我终止进程之前花费了 4 多分钟)而只是更改将 ManualGC 设置为 true 会将内存使用量限制在大约 600MB 并在 29 秒内完成执行?

  2. 为什么保留 ManualGC false 并将 Write 更改为 true 将内存使用限制在大约 12 GB 并允许在大约 59 秒内完成执行而无需分页?

我的应用程序中的一些代码片段(显然更改了一些名称):

private static int callCount = 0;
private const bool ManualGC = false;
private const bool Write = false;

internal static void CommonlyCalled()
{
++callCount;

if ( callCount % 100000 == 0)
{
if (ManualGC)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
if (Write) Console.WriteLine(HandleErrorsCallCount);
}

DoLogic();
}

内存是通过 Windows 任务管理器中的“内存(专用工作集)”列来衡量的。行为始终可重复。

最佳答案

and has some C# destructors to release some of the C++ unmanaged memory

如果您的包装器很小并且您的 C++ 代码需要大量内存,这还不够。您只是没有对 GC 施加足够的压力来让它尽快调用您的终结器。实现 IDisposable 来解决这个问题是样板文件。但这不是一个完整的解决方案,您应该将其告知 GC,以便它可以采取一些措施。一些可玩的代码:

using System;
using System.Runtime.InteropServices;

class Program {
static void Main(string[] args) {
while (!Console.KeyAvailable) {
new Wrapper();
}
}
}

class Wrapper {
private const int alloc = 10 * 1024; // C++ object memory usage
private readonly bool useamp = false; // Change this after testing
private IntPtr mem;

public Wrapper() {
if (useamp) GC.AddMemoryPressure(alloc);
mem = Marshal.AllocHGlobal(alloc);
}
~Wrapper() {
Marshal.FreeHGlobal(mem);
if (useamp) GC.RemoveMemoryPressure(alloc);
}
}

在运行时观察该程序的内存使用情况。在我的机器上,私有(private)字节最多可达半个演出。现在更改 useamp 并再次运行,您会发现它 更有效率,只需要 4 MB。无需调用 Dispose :) 在 Win 8.1、.NET 4.5.1 上测试,您可能会在较旧的 .NET 版本上获得截然不同的结果。

您为 alloc 选择的值并不重要,它只需要在大概范围内即可。显然您需要的空间远远超过 10KB。

关于c# - 具有许多 C++ 互操作调用的自动 C# 垃圾收集器性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26266479/

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