C# 字节数组拼接的速度实验(Array.copy(),Buffer.BlockCopy(),Contact())
无聊做了如题的一个算法的优劣性能比较,由于很多人都只关心结果,那么我先贴出结果如下:

由于我的测试数据量比较小,只能得出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())的更多相关文章
- C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy
static void Main(string[] args) { , , , , , }; ;//目标数组大小 int int_size = sizeof(int);//用于获取值类型的字节大小. ...
- 字节数组与String类型的转换
还是本着上篇文章的原则,只不过在Delphi中string有点特殊! 先了解一下Delphi中的string 1. string = AnsiString = 长字符串,理论上长度不受限制,但其实受限 ...
- 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来。
问题 从包含10个无符号数的字节数组array中选出最小的一个数存于变量MIN中,并将该数以十进制形式显示出来. 代码 data segment arrey db 0,1,2,4,6,5,7,9,8, ...
- [19/04/01-星期一] IO技术_字节流分类总结(含字节数组(Array)流、字节数据(Data)流、字节对象(Object)流)
一.字节流分类概括 -->1.ByteArrayInputStream /ByteArrayOutputStream(数组字节输入输出) InputStream/OutputStr ...
- 文件读写(三)利用FileStream类操作字节数组byte[]、BinaryFormatter、内存流MemoryStream
一.Stream类概述 在.NET Framework中,文件和流是有区别的.文件是存储在磁盘上的数据集,它具有名称和相应的路径.当打开一个文件并对其进行读/写时,该文件就称为流(stream).但是 ...
- Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换
public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...
- PHP 数组拼接成字符串
PHP[知识分享] 数组拼接成字符串 <?php // 格式: [二维数组] Array ( [0] => Array ( [topicid] => 1 ) [1] => Ar ...
- Java 中的字符串与 []byte 字节数组
一.字符串 1.比较 String.HashSet.List 中的 contains 方法 其中, String.List 都使用了 indexOf 方法,本质是遍历,时间效率为 O(n).而 Has ...
- Scala字节数组转换为数字
1. 2个字节数组转换为整数 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = { val b0 = _bytes(_offset) ...
随机推荐
- topK问题解法
topK问题的最佳解法是堆排,下面介绍用堆排来解决该问题. 堆排解决topK问题的思路,取出前K个数,最重要的就是要减少比较的次数,用堆排维护一个K大小的堆,比如一个小顶堆,则堆顶为堆中最小的值,将堆 ...
- python请求带cookie
先获得cookie到文件 import cookielib import urllib2 #设置保存cookie的文件,同级目录下的cookie.txt filename = 'cookie.txt' ...
- MFC设置对话框背景和边框颜色
对于对话框,只需要重载默认的消息处理函数就行了: // 重载默认的消息处理函数,主要处理WM_MOVE WM_PAINT WM_NCPAINT WM_NCACTIVATE WM_NOTIFY这// 几 ...
- git 以及 工作区 版本库 暂存区
https://www.jianshu.com/p/a308acded2ce 这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...
- vue 中父子组件传值:props和$emit
更新----------- 1 父组件向子组件传值:通过props数组: 在vue-cli Login.vue父组件中有AcceptAndRefuse.vue子组件,首先import进子组件hello ...
- pat 团体天梯赛 L3-010. 是否完全二叉搜索树
L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...
- Codeforces Round #398 (Div. 2) A-E
分数史上新低 开场5分钟过了A题,想着这次赌一把手速,先去切C吧 看完C题觉得这应该是道水题,码了十分钟提交,WA 想着这明明是道水题,估计少考虑了情况,添了几行再交,WA 不可能啊,这题都A不掉,和 ...
- NOIP2015提高组T2 洛谷P2661 信息传递
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...
- UVA1218 Perfect Service
Time Limit: 3000MS 64bit IO Format: %lld & %llu /*by SilverN*/ #include<iostream> #inc ...
- 【HDOJ1828&&POJ1177】Picture(线段树,扫描线)
题意:给定n个矩形,求他们的并的周长 n<=5e3,abs(x[i])<=1e4 思路:From https://www.cnblogs.com/kuangbin/archive/2013 ...