gpt4 book ai didi

c# - 简单的缓存让 GC 发疯?

转载 作者:行者123 更新时间:2023-11-30 20:57:05 27 4
gpt4 key购买 nike

我使用的是 C# 3.5 和 VS 2010 旗舰版。

我正在优化(为了提高速度)具有四个嵌套 for 循环的机器学习算法。我发现一个简单的缓存(一个对象的张量)可能会极大地提高性能,因为有很多相同对象的重新分配。

这是实现前后的对比。

之前:

four nested for-loops:
var object = new object(3 parameters);
Calculate(object, other params)

之后:

var cache = new object[count1,count2,count3];
three nested for-loops:
cache[param1, param2, param3] = new object(3 params);

four nested for-loops:
var object = cache[3 parameters];
Calculate(object, other params)

我分析了这两种方法,“之前”版本速度相当快,大约 18% 的时间花在了 GC 上,而“之后”版本花费了大约 88% 的时间在 GC 上。很明显,添加此缓存会使 GC 事件增加,但我看不出这是怎么可能的。

我在应用程序中使用了很多长期存在的对象。在分析时我的机器没有承受重负载。张量是使用多维数组(不是锯齿状数组)实现的。上述两种方法中的最内层循环都是使用 Parallel.For 结构实现的,在循环之前我分配了一个小的 double 数组。

如何减少 GC 花费的时间?

编辑 #1:结果确实来自 Release模式。

编辑 #2:after 方法的四个 for 循环的实际代码:

List<int> labels = // count = 80
List<int> tokens = // count = 35

var table = new double[tokens.Count, labels.Count, labels.Count];
var cachedObjects = new CachedObject[tokens.Count, labels.Count, labels.Count];
for (int k = 0; k < tokens.Count; k++)
{
foreach (var tagCurrent in labels)
{
foreach (var labelBack in labels)
{
double[] value = new double[labels.Count];
Parallel.For(0, labels.Count, (i) =>
{
CachedObject CachedObject = cachedObjects[k, labelsBackFurther[i], labelBack];

var me = ModelEstimate(vOptimal, CachedObject, tagCurrent, labels);
value[i] = table[k - 1, labels[i], labelBack] * me;
});

var maxValue = 0;
var maxTagIdx = 0;
for (int j = 0; j < value.Length; j++)
{
var item = value[j];
if (item > maxValue)
{
maxValue = item;
maxTagIdx = j;
}
}

table[k, labelBack, tagCurrent] = maxValue;
}
}
}

最佳答案

GC 受两个因素影响:分配数量和幸存者数量。

分配触发收集,因此分配越多,收集越频繁。

如果应用保留大量数据,那么第 2 代集合可能会变得非常昂贵。如果您看到在 GC 上花费了很多时间,通常就是这种情况(收集 Gen 0 和 1 很快,因为它们的大小有限)。

在您的情况下,听起来您想保留缓存。如果这样做,您需要确保减少分配,因为您不想触发昂贵的第 2 代收集。

您可以使用 PerfView跟踪分配。

关于c# - 简单的缓存让 GC 发疯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17122044/

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