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

由于我的测试数据量比较小,只能得出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. Linux 程序编译过程的来龙去脉

    大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...

  2. bzoj 4310 跳蚤 二分答案+后缀数组/后缀树

    题目大意 给定\(k\)和长度\(\le10^5\)的串S 把串分成不超过\(k\)个子串,然后对于每个子串\(s\),他会从\(s\)的所有子串中选择字典序最大的那一个,并在选出来的\(k\)个子串 ...

  3. maven中的继承和聚合的关系

    maven中的继承和聚合的关系:两者的目的是不一样的,聚合的目的是能够快速的构建项目,继承的目的是减少重复配置.聚合:定义一个聚合模块,然后在pom文件中添加<module></mo ...

  4. Atcoder CODE FESTIVAL 2017 qual C C - Inserting 'x' 回文串

    题目链接 题意 给定字符串\(s\),可以在其中任意位置插入字符\(x\). 问能否得到一个回文串,若能,需插入多少个\(x\). 思路 首先统计出现次数为奇数的字符\(cnt\). \(cnt\ge ...

  5. link 和 runtime-link,搭配shared 和 static(转)

    原文转自 http://blog.csdn.net/yasi_xi/article/details/8660549 参考: http://bbs.sjtu.edu.cn/bbscon,board,C, ...

  6. hdu 2739(尺取法)

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22876 ...

  7. (1)WCF托管

    wcf 托管方式有很多种,常见的托管方式,iis,was,控制台,winfrom等. 先创建一个wcf服务 IService1.cs using System.ServiceModel; namesp ...

  8. HDU 1998 奇数阶魔方【模拟填数/注意边界和细节】

    奇数阶魔方 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. ansible 2.7.1 常见错误总结

    1.RequestsDependencyWarning (refer to http://blog.51cto.com/mjunetwslinux/2177727?source=dra) python ...

  10. bzoj 1412: [ZJOI2009]狼和羊的故事

    http://www.lydsy.com/JudgeOnline/problem.php?id=1412 超级源点连向所有的狼,超级汇点连向所有羊,流量为INF 相邻连边流量为1,最小割 #inclu ...