gpt4 book ai didi

c# - 在 C# 中通过引用传递数组中的结构对性能有何影响

转载 作者:太空狗 更新时间:2023-10-30 00:17:25 27 4
gpt4 key购买 nike

我正在使用 C#/XNA 编写一段代码,我非常关注其中的性能。其中一部分是将存储在数组中的几个结构传递给各种函数。

在询问之前,这些确实应该是结构,而不是类。它们本质上是值类型,并且它们需要(基本上)存在于堆栈中。它们有很多,它们来来去去非常快,让垃圾收集器参与进来(即使我在运行池)会很昂贵。

我已经通过引用传递大大提高了性能,但我想知道当数组相同索引处的相同结构通过引用传递给几个不同的函数时,这对性能有何影响。我假设为了让这一切正常工作,C# 必须在传递结构之前在内部固定数组指针。我会通过先固定结构并改为传递指针来提高性能吗?

例如。如果我有类似的东西:

for(int i = 0; i < array.Length; ++i)
{
value = Function1(ref array[i]);

// Lots of code....

otherValue = Function2(ref array[i]);

// Lots of code....

anotherValue = Function3(ref array[i]);
}

C# 本质上不需要这样做吗?

for(int i = 0; i < array.Length; ++i)
{
pin(array);
value = Function1(ref array[i]);
unpin(array);

// Lots of code....

pin(array);
otherValue = Function2(ref array[i]);
unpin(array);

// Lots of code....

pin(array);
anotherValue = Function3(ref array[i]);
unpin(array);
}

我这样做会更好吗?

for(int i = 0; i < array.Length; ++i)
{
fixed(struct* working = ^array[i])
{
value = Function1(working);

// Lots of code....

otherValue = Function2(working);

// Lots of code....

anotherValue = Function3(working);
}
}

或者,甚至更好,

fixed(struct* working = ^array[0]) 
{
for(int i = 0; i < array.Length; ++i)
{
value = Function1(working[i]);

// Lots of code....

otherValue = Function2(working[i]);

// Lots of code....

anotherValue = Function3(working[i]);
}
}

或者 C# 编译器/JITter 是否足够智能以自动固定数组?

最佳答案

您将托管引用与指针混淆了。

托管引用永远不需要固定,即使它指向数组中的一个元素,因为 GC“知道”该引用并将在移动数组时更新它。

只有不安全代码中的非托管指针才需要固定,并且出于性能原因应尽可能避免。

关于c# - 在 C# 中通过引用传递数组中的结构对性能有何影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917209/

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