• Array.Copy vs Buffer.BlockCopy


    http://stackoverflow.com/questions/1389821/array-copy-vs-buffer-blockcopy

    Since the parameters to Buffer.BlockCopy are byte-based rather than index-based, you're more likely to screw up your code than if you use Array.Copy,

    so I would only use Buffer.BlockCopy in a performance-critical section of my code.

    http://stackoverflow.com/questions/5099604/any-faster-way-of-copying-arrays-in-c

    Use Buffer.BlockCopy. Its entire purpose is to perform fast (see Buffer):

    This class provides better performance for manipulating primitive types than similar methods in the System.Array class.

    Admittedly无可否认, I haven't done any benchmarks基准;标准检查程序, but that's the documentation. It also works on multidimensional多维 arrays; just make sure that you're always specifying how many bytes to copy, not how many elements, and also that you're working on a primitive基元 array.

    Also, I have not tested this, but you might be able to squeeze挤 a bit more performance out of the system if you bind a delegate to System.Buffer.memcpyimpl and call that directly. The signature is:

    internal static unsafe void memcpyimpl(byte* src, byte* dest, int len)

    It does require pointers, but I believe it's optimized for the highest speed possible, and so I don't think there's any way to get faster than that, even if you had assembly at hand.

    Update:

    Due to requests (and to satisfy my curiosity), I tested this:

    using System;
    using System.Diagnostics;
    using System.Reflection;
    
    unsafe delegate void MemCpyImpl(byte* src, byte* dest, int len);
    
    static class Temp
    {
        //There really should be a generic CreateDelegate<T>() method... -___-
        static MemCpyImpl memcpyimpl = (MemCpyImpl)Delegate.CreateDelegate(
            typeof(MemCpyImpl), typeof(Buffer).GetMethod("memcpyimpl",
                BindingFlags.Static | BindingFlags.NonPublic));
        const int COUNT = 32, SIZE = 32 << 20;
    
        //Use different buffers to help avoid CPU cache effects
        static byte[]
            aSource = new byte[SIZE], aTarget = new byte[SIZE],
            bSource = new byte[SIZE], bTarget = new byte[SIZE],
            cSource = new byte[SIZE], cTarget = new byte[SIZE];
    
    
        static unsafe void TestUnsafe()
        {
            Stopwatch sw = Stopwatch.StartNew();
            fixed (byte* pSrc = aSource)
            fixed (byte* pDest = aTarget)
                for (int i = 0; i < COUNT; i++)
                    memcpyimpl(pSrc, pDest, SIZE);
            sw.Stop();
            Console.WriteLine("Buffer.memcpyimpl: {0:N0} ticks", sw.ElapsedTicks);
        }
    
        static void TestBlockCopy()
        {
            Stopwatch sw = Stopwatch.StartNew();
            sw.Start();
            for (int i = 0; i < COUNT; i++)
                Buffer.BlockCopy(bSource, 0, bTarget, 0, SIZE);
            sw.Stop();
            Console.WriteLine("Buffer.BlockCopy: {0:N0} ticks",
                sw.ElapsedTicks);
        }
    
        static void TestArrayCopy()
        {
            Stopwatch sw = Stopwatch.StartNew();
            sw.Start();
            for (int i = 0; i < COUNT; i++)
                Array.Copy(cSource, 0, cTarget, 0, SIZE);
            sw.Stop();
            Console.WriteLine("Array.Copy: {0:N0} ticks", sw.ElapsedTicks);
        }
    
        static void Main(string[] args)
        {
            for (int i = 0; i < 10; i++)
            {
                TestArrayCopy();
                TestBlockCopy();
                TestUnsafe();
                Console.WriteLine();
            }
        }
    }

    or, in other words: they're very competitive; as a general rule, memcpyimpl is fastest, but it's not necessarily worth worrying about.

  • 相关阅读:
    GIT学习笔记(2):时光机穿梭与远程仓库
    CNN学习笔记:正则化缓解过拟合
    Java分布式:RPC(远程过程调用)
    设计模式:学习笔记(12)——代理模式
    算法:乐观锁与悲观锁
    Python:笔记(5)——错误、调试和测试
    算法:LRU(最近最少使用)
    Python:笔记(4)——高级特性
    方法论:带着问题找答案
    Cache-Aside模式
  • 原文地址:https://www.cnblogs.com/chucklu/p/5219296.html
Copyright © 2020-2023  润新知