【问题标题】:C#: how to copy a large array of structs efficiently? [duplicate]C#:如何有效地复制大量结构? [复制]
【发布时间】:2012-09-27 02:34:51
【问题描述】:

可能重复:
C#: Any faster way of copying arrays?

我有一个这样的结构数组:

struct S
{
    public long A;
    public long B;
}

...
S[] s1 = new S[1000000];
...
S[] = new S[s1.Length];
// Need to create a copy here.

我可以使用不安全模式并将源结构数组复制到字节数组,然后从字节数组复制到目标结构数组。但这意味着我将不得不分配一个巨大的中间字节数组。有没有办法避免这种情况?是否可以以某种方式将目标数组表示为字节数组并直接复制到那里?

unsafe
{
    int size = Marshal.SizeOf(s0[0]) * s0.Length;
    byte[] tmp = new byte[size];
    fixed (var tmpSrc = &s0[0])
    {
        IntPtr src = (IntPtr)tmpSrc;
        Marchal.Copy(tmpSrc, 0, tmp, 0, size);
    }

    // The same way copy to destination s1 array...
}

【问题讨论】:

  • 您是否尝试过仅进行普通数组复制并对其进行性能测试?在优化之前验证正常路线不会太慢。
  • @PeterRitchie 删除了我的评论。实际上使用 Buffer.BlockCopy 可能是可行的。尽管如此,这个问题仍然有效。也许不是从实际的角度来看:)
  • 看起来像是对副本的合理路标...考虑不删除。
  • 我投票决定重新开放,因为这专门针对 structs 数组,因此链接到的问题没有解决这个问题。例如。 BlockCopy 仅适用于原始类型的数组,不适用于结构。

标签: c# .net


【解决方案1】:

Buffer.BlockCopy 的情况下,它将bytes[] 复制到byte[] 而不是数组中的逻辑元素。

但这确实取决于具体情况。

请先使用Array.Copy 测试您的代码并查看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多