c# - 获取数组最后 N 个元素的最有效方法

标签 c# arrays performance linq

对于一个项目,我将不得不经常获取包含大量数据的数组的最后 N 个元素。

我试过

myArray.Skip(myArray.Length - toTake).Take(toTake)

但我发现它很慢。

我把它比作这个:

public static int[] TakeLast(this int[] inputArray, int count)
{
    int[] returnArray = new int[count];
    int startIndex = Math.Max(inputArray.Count() - count, 0);
    unsafe
    {
        fixed (int* itemArrayPtr = &(inputArray[startIndex]))
        {
            fixed (int* arrayPtr = &(returnArray[0]))
            {
                int* itemValuePtr = itemArrayPtr;
                int* valuePtr = arrayPtr;

                for (int i = 0; i < count; i++)
                {
                    *valuePtr++ = *itemValuePtr++;
                }
            }
        }
    }
    return returnArray;
}

这很好用,因为它不能是通用的(我希望它能适用于任何基本类型(int、float、double、...)。

有没有一种方法可以通过通用/linq/...方法实现可比较的性能?我不需要让它在 IEnumerable 上工作,Array 对我来说就足够了。

编辑 我目前正在测试你给我的所有方法,现在它是 Array.Copy 似乎更快:

Generating array for 100000000 elements.
SkipTake: 00:00:00.3009047
Unsafe: 00:00:00.0006289
Array.Copy: 00:00:00.0000012
Buffer.BlockCopy: 00:00:00.0001860
Reverse Linq: 00:00:00.2201143
Finished

最佳答案

来自评论:

public static T[] TakeLast<T>(this T[] inputArray, int count)
{
    var result = new T[count];
    Array.Copy(inputArray, inputArray.Length - count, result, 0, count);
    return result;
}

似乎表现不错。值得指出的是,根据具体需要,可能完全避免使用新数组,并迭代原始的 inputArray。没有比完全不复制更快的复制方法了。 :)

关于c# - 获取数组最后 N 个元素的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605419/

相关文章:

performance - 为什么在 Delphi 中运行巨大的 for 循环时没有发生 'form close' 事件?

performance - 在OOB中运行应用程序时出现Jerky Silverlight 4动画

c# - 在异步委托(delegate)中断言异常

javascript - 处理稀疏数组的 JSON 实现

javascript - 如何检查 Javascript 对象值是否为数组且不为空

java - 使用 JSONObject 在 Java 中为以下结构创建嵌套 JSON 对象?

database - 文件系统和数据库之间的写入性能

c# - MongoDB C# 驱动程序 - 从 Controller 返回字符串类型的 Id

c# - LINQ Select - CS0411 无法从用法中推断出类型参数 - 我做错了什么?

c# - VB.NET/C#:启动ASIO控制面板