无聊做了如题的一个算法的优劣性能比较,由于很多人都只关心结果,那么我先贴出结果如下:

由于我的测试数据量比较小,只能得出Array.Copy()和Buffer.BlockCopy()方法性能要好于Contact(),这个不用比较也能想到,如果想知道前两个谁的性能更好,

有兴趣的可以修改源码中的测试数据量就可以了。

测试源码如下:

        static int len1 = ;
static int len2 = ;
static byte[] bytes0 = new byte[len1];
static byte[] bytes1 = new byte[len2];
static void Main(string[] args)
{
// Uses the second Core or Processor for the Test
Process.GetCurrentProcess().ProcessorAffinity = new IntPtr();
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
// Prevents "Normal" Threads
Thread.CurrentThread.Priority = ThreadPriority.Highest;
Stopwatch sw = new Stopwatch();
byte[] resultBytes = null;
InitBytes(); //test
sw.Reset();
sw.Start();
while (sw.ElapsedMilliseconds < ) // A Warmup of 1000-1500 mS
// stabilizes the CPU cache and pipeline.
{
resultBytes = Contact(bytes0, bytes1); // Warmup
}
sw.Stop();
for (int i = ; i < ; i++)
{
sw.Reset();
sw.Start();
resultBytes = Contact(bytes0, bytes1);
sw.Stop();
Console.WriteLine("Contact Ticks: {0} Time: {1} ms", sw.ElapsedTicks, sw.ElapsedMilliseconds);
}
sw.Reset();
sw.Start();
while (sw.ElapsedMilliseconds < ) // A Warmup of 1000-1500 mS
// stabilizes the CPU cache and pipeline.
{
resultBytes = BufferCopy(bytes0, bytes1); // Warmup
}
sw.Stop();
for (int i = ; i < ; i++)
{
sw.Reset();
sw.Start();
resultBytes = BufferCopy(bytes0, bytes1);
sw.Stop();
Console.WriteLine("BufferCopy Ticks: {0} Time: {1} ms", sw.ElapsedTicks, sw.ElapsedMilliseconds);
}
sw.Reset();
sw.Start();
while (sw.ElapsedMilliseconds < ) // A Warmup of 1000-1500 mS
// stabilizes the CPU cache and pipeline.
{
resultBytes = ArrayCopy(bytes0, bytes1); // Warmup
}
sw.Stop();
for (int i = ; i < ; i++)
{
sw.Reset();
sw.Start();
resultBytes = ArrayCopy(bytes0, bytes1);
sw.Stop();
Console.WriteLine("ArrayCopy Ticks: {0} Time: {1} ms ", sw.ElapsedTicks, sw.ElapsedMilliseconds);
}
Console.ReadKey();
}
static void InitBytes()
{
for(int i=;i<len1;i++)
{
bytes0[i] =(byte)(i % );
}
for (int i = ; i < len2; i++)
{
bytes1[i] = (byte)(i % );
}
}
static byte[] Contact(byte[] bytes0,byte[] bytes1)
{
return bytes0.Concat(bytes1).ToArray();
}
static byte[] BufferCopy(byte[] bytes0,byte[] bytes1)
{
byte[] resultBytes = new byte[bytes0.Length+bytes1.Length];
Buffer.BlockCopy(bytes0, , resultBytes, , bytes0.Length);
Buffer.BlockCopy(bytes1, , resultBytes, bytes0.Length, bytes1.Length);
return resultBytes;
}
static byte[] ArrayCopy(byte[] bytes0, byte[] bytes1)
{
byte[] resultBytes = new byte[bytes0.Length + bytes1.Length];
Array.Copy(bytes0, , resultBytes, , bytes0.Length);
Array.Copy(bytes1, , resultBytes, bytes0.Length, bytes1.Length);
return resultBytes;
}

C# 字节数组拼接的速度实验(Array.copy(),Buffer.BlockCopy(),Contact())的更多相关文章

  1. C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy

    static void Main(string[] args) { , , , , , }; ;//目标数组大小 int int_size = sizeof(int);//用于获取值类型的字节大小. ...

  2. 字节数组与String类型的转换

    还是本着上篇文章的原则,只不过在Delphi中string有点特殊! 先了解一下Delphi中的string 1. string = AnsiString = 长字符串,理论上长度不受限制,但其实受限 ...

  3. 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。

    问题 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来. 代码 data segment arrey db 0,1,2,4,6,5,7,9,8, ...

  4. [19/04/01-星期一] IO技术_字节流分类总结(含字节数组(Array)流、字节数据(Data)流、字节对象(Object)流)

    一.字节流分类概括 -->1.ByteArrayInputStream /ByteArrayOutputStream(数组字节输入输出)        InputStream/OutputStr ...

  5. 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream

    一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...

  6. Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换

    public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...

  7. PHP 数组拼接成字符串

    PHP[知识分享] 数组拼接成字符串 <?php // 格式: [二维数组] Array ( [0] => Array ( [topicid] => 1 ) [1] => Ar ...

  8. Java 中的字符串与 []byte 字节数组

    一.字符串 1.比较 String.HashSet.List 中的 contains 方法 其中, String.List 都使用了 indexOf 方法,本质是遍历,时间效率为 O(n).而 Has ...

  9. Scala字节数组转换为数字

    1. 2个字节数组转换为整数 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = { val b0 = _bytes(_offset) ...

随机推荐

  1. topK问题解法

    topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题. 堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆 ...

  2. python请求带cookie

    先获得cookie到文件 import cookielib import urllib2 #设置保存cookie的文件,同级目录下的cookie.txt filename = 'cookie.txt' ...

  3. MFC设置对话框背景和边框颜色

    对于对话框,只需要重载默认的消息处理函数就行了: // 重载默认的消息处理函数,主要处理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY这// 几 ...

  4. git 以及 工作区 版本库 暂存区

    https://www.jianshu.com/p/a308acded2ce            这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...

  5. vue 中父子组件传值:props和$emit

    更新----------- 1 父组件向子组件传值:通过props数组: 在vue-cli Login.vue父组件中有AcceptAndRefuse.vue子组件,首先import进子组件hello ...

  6. pat 团体天梯赛 L3-010. 是否完全二叉搜索树

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  7. Codeforces Round #398 (Div. 2) A-E

    分数史上新低 开场5分钟过了A题,想着这次赌一把手速,先去切C吧 看完C题觉得这应该是道水题,码了十分钟提交,WA 想着这明明是道水题,估计少考虑了情况,添了几行再交,WA 不可能啊,这题都A不掉,和 ...

  8. NOIP2015提高组T2 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  9. UVA1218 Perfect Service

    Time Limit: 3000MS     64bit IO Format: %lld & %llu /*by SilverN*/ #include<iostream> #inc ...

  10. 【HDOJ1828&&POJ1177】Picture(线段树,扫描线)

    题意:给定n个矩形,求他们的并的周长 n<=5e3,abs(x[i])<=1e4 思路:From https://www.cnblogs.com/kuangbin/archive/2013 ...