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) ...
随机推荐
- EasyUI序列化提交学习总结
jquery easyui将form表单元素的值序列化成对象 form表单 <form id="ff"> <input type="text" ...
- bzoj 4310 跳蚤 二分答案+后缀数组/后缀树
题目大意 给定\(k\)和长度\(\le10^5\)的串S 把串分成不超过\(k\)个子串,然后对于每个子串\(s\),他会从\(s\)的所有子串中选择字典序最大的那一个,并在选出来的\(k\)个子串 ...
- MYSQL常用的Show命令笔记
1.查询数据库 SHOW DATABASES; 2.查询数据库中表 SHOW TABLES; SHOW TABLES FROM db; 3.查询表索引 SHOW INDEX FROM table 4. ...
- BZOJ 3940: [Usaco2015 Feb]Censoring
3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 367 Solved: 173[Subm ...
- xCode控制台的使用-应用闪退原因跟踪
xCode控制台的使用-应用闪退原因跟踪 今天遇到这个一个问题,使用xCode version = 5.0 编译一个程序,刷到IOS7设备后,应用运行正常,但是刷新到IOS<7,打开饮用后就会出 ...
- 图片定位 css
原文发布时间为:2009-07-14 -- 来源于本人的百度文章 [由搬家工具导入] 原图片:http://cache.soso.com/wenwen/i/w_icon.gif 从这图片定位几张图片出 ...
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...
- Codeforces Gym101502 E.The Architect Omar-find()函数
E. The Architect Omar time limit per test 1.0 s memory limit per test 256 MB input standard input ...
- MyEclipse导入外部项目
1,File 2,Preferences 3,General----Existing----next 4,Browse选择要导入的项目---finash 5,导入后可能会出现很多error 检查项目的 ...
- Apache/Nginx为PHP设置、添加$_SERVER服务器环境变量
在PHP开发中为了区分线上生产环境还是本地开发环境, 如果我们能通过判断$_SERVER['RUNTIME_ENVIROMENT']为 'DEV'还是'PRO'来区分该多好, 可惜的是$_SERVER ...