Array.Reverse()编译成什么?

4
我希望您能告诉我在C#中Array.Reverse()编译成什么样子,以及做了哪些优化。我的研究让我走了多条路线,其中一些值得注意的是像这样使用XOR方法:
Reverse(Array)
{

   for(int i = 0, int len = Array.Length; i < Array.Length, i++ len--)
   {
       Array[i] ^= Array[len];
       Array[len] ^= Array[i];
       Array[i] ^= Array[len];
   }
}

我发现它非常适用于处理较小的数组,但随着数组变得越来越大,性能开始下降,尽管由于反向过程的内存性质,它似乎具有最好的内存应用。
第二种最值得注意的反转数组的方法是使用一个临时数组,我不会写出来,因为它非常简单。但基本上将初始数组的第一个元素设置为临时数组的最后一个元素,依此类推。当内存不是问题时,这种方法往往是最快的方法。
所以我的问题是,Array.Reverse()是否使用特定的方法?如果没有,它如何确定使用哪种方法?这实际上归结为我是否应该信任系统库和编译器决定什么是最快的解决方案,以及我应该信任那个决定多少。
1个回答

4

Array.Reverse当前在.NET框架中是通过使用临时数组实现的。您可以通过使用ILSpy找出这一点。编译器对此没有发言权。该方法以某种方式实现,编译器在这里没有任何改变。

无论这是否是最佳解决方案取决于您对最佳方案的定义,因此您需要为自己定义并附加一个分析器来验证它。


2
Mono的实现不使用临时数组:https://github.com/mono/mono/blob/master/mcs/class/corlib/System/Array.cs - Ahmed KRAIEM
2
@AhmedKRAIEM:这只是显示它是多么的实现细节,你在连接分析器并验证当前实现在你的特定情况下是否存在性能问题之前肯定不应该关心它。 - Daniel Hilgarth
虽然我知道这是应用程序特定的,但我想知道是否有任何“编译器魔法”可以选择适当的方法来使用。然而,似乎并非如此。 - Nomad101
@Nomad101:没有。 - Daniel Hilgarth
好的,那比我想象中要容易得多,感谢提供信息。 - Nomad101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接