zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    iOS-实现键盘右上角完成按钮
    iOS-开发中单例模式的实现
    iOS-实现高斯模糊效果(swift)
    iOS-解决UITableView有footerView时最后一个cell不显示分割线问题
    fenics 笔记 -- Possion Problem
    笔记
    Hyper-reduced projective dynamics 手推公式
    Gmsh 四面体单元剖分
    SoftRoboSim 之程序框架
    物理引擎中的时间积分方法及求解
  • 原文地址:https://www.cnblogs.com/chucklu/p/5219296.html
Copyright © 2011-2022 走看看