【问题标题】:Fast memcpy in C#C#中的快速memcpy
【发布时间】:2013-04-04 11:41:53
【问题描述】:

我想用这样的原型编写一个 C# 方法:

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len);

这个方法我有两个选择:

1.

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
    for (int i = 0; i < len; i++)
    {
        dst[dstOffset + i] = src[srcOffset + i];
    }
}

2.

void memcpy(byte[] dst, int dstOffset, byte[] src, int srcOffset, int len)
{
    IntPtr intPtr = getIntPtr(dst, dstOffset);
    System.Runtime.InteropServices.Marshal.Copy(src, srcOffset, intPtr, len);
}

IntPtr getIntPtr(byte[] buffer, int offset)
{
    IntPtr intPtr;
    unsafe
    {
        fixed (byte* p1 = buffer)
        {
            byte* p2 = p1 + offset;
            intPtr = (IntPtr)p2;
        }
    }
    return intPtr;
}

问题:

A.我猜选项 2 比选项 1 快,对吗?

B.还有其他更快的方法吗?

非常感谢。

【问题讨论】:

  • @Jonathon:测试不太可能发现竞争条件(wrt 垃圾收集)。
  • 另外,不要re-invent the wheel
  • @Simon:这不是速度问题。这是一个正确性问题。
  • @BenVoigt “我猜选项 2 比选项 1 快。是吗?”。这是一个速度问题/问题..因此“自己进行基准测试”。
  • @Simon:所有优化问题主要是正确性问题,其次才是性能问题。如果不需要正确性,我会将您的整个程序替换为一个空文件,我向您保证会快得多

标签: c# performance memcpy


【解决方案1】:

选项 #2 已损坏,因为您在指针指向的对象不再固定后使用指针。在fixed 块内获得的指针只能在同一个fixed 块内使用。看来您无论如何都应该使用Marshal.UnsafeAddrOfPinnedArrayElement(并且只能在固定数组的fixed 块内使用它)。

看看Buffer.BlockCopy

【讨论】:

    猜你喜欢
    • 2012-06-25
    • 2011-11-13
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多