gpt4 book ai didi

C#对象比较和内存分配

转载 作者:行者123 更新时间:2023-11-30 13:46:17 26 4
gpt4 key购买 nike

我的同事有 10 个用于大多数基本类型的 CopyIfDifferent 函数。 string, int, double, bool...

我对 1000 万个项目进行了测试,在我的机器上更改值比检查它们是否不同然后更改它们快 40% 左右。我测试了 1000 万个不需要更改的项目和 1000 万个需要更改的项目。

当问他为什么有这些功能而不是仅仅更改值时,因为它更便宜。他告诉我,这是为了防止内存分配和内存碎片。因此,如果对象相同,它可以保留在相同的内存地址中,因此速度更快。

public static void CopyIfDifferent(ref string vValueToCopyTo, string vValueToCopyFrom)
{
if (!ValuesAreEqual(vValueToCopyTo, vValueToCopyFrom))
{
vValueToCopyTo = vValueToCopyFrom;
}
}
public static bool ValuesAreEqual(string vValue1, string vValue2)
{
if (vValue1 == null && vValue2 == null)
{
return true;
}
if (vValue1 == null || vValue2 == null)
{
return false;
}
return vValue1 == vValue2;
}

使用函数

Utils.CopyIfDifferent(ref GroupIDFK, item.GroupIDFK);

我的问题是。在更改之前检查值而不是仅仅更改是否更好?如果是,为什么?

最佳答案

只看字符串函数,如果有的话,这会增加内存使用量,而不是减少它。 (但是,由于字符串实习,它通常不会实际增加内存使用量,但也无济于事。)

为什么?好吧,让我们看看方法:

public static void CopyIfDifferent(ref string vValueToCopyTo, string vValueToCopyFrom)
{
if (!ValuesAreEqual(vValueToCopyTo, vValueToCopyFrom))
{
vValueToCopyTo = vValueToCopyFrom;
}
}

现在考虑在字符串不同时调用它:

string s1 = "One";
string s2 = "Two";

CopyIfDifferent(ref s2, s1);

这会做什么?好吧,它会做的和做的完全一样:

s2 = s1;

只有方法调用的开销和昂贵的字符串比较。所以那是没有意义的。

现在如果字符串相同呢?在这种情况下,它什么都不做,并将 s2 保留为原始引用。这意味着我们现在有两个对具有相同内容的字符串的引用,而不是一个——这表面上是一种内存浪费,并使事情变得更糟。幸运的是,由于字符串驻留,只有字符串的一个实际副本(通常)会保存在内存中,这稍微缓解了这个问题。

总的来说,这完全是浪费时间,它会让事情变得更慢,你当然不应该这样做。

对于 int 之类的值类型如何处理呢?如果实现看起来像这样:

public static void CopyIfDifferent(ref int vValueToCopyTo, int vValueToCopyFrom)
{
if (!ValuesAreEqual(vValueToCopyTo, vValueToCopyFrom))
{
vValueToCopyTo = vValueToCopyFrom;
}
}

public static bool ValuesAreEqual(int vValue1, int vValue2)
{
return vValue1 == vValue2;
}

那会很糟糕...

一个简单的 int x = y; 变成了一个非常低效的将指针插入堆栈(ref 参数)然后取消引用指针(当比较值),然后如果值不同则分配给指针。

就像@dcastro 在下面指出的那样,int 无论如何都被复制了 3 次——这完全是在 mock 试图优化 int 的复制第一名。

只是……不。一千次,不。

关于C#对象比较和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22400172/

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