首页 > 代码库 > 字节数组合并效率测试
字节数组合并效率测试
因为项目需要合并几十K长的数组,本着效率出发,测试了一下各种方法。
我只找到了:
CopyTo 方式
Array.Copy 方式
BlockCopy 方式
MemoryStream 方式
Concat 方式
这几种方法,还有for循环一个个复制,想想也没有啥效率,因为还会多一个加法运算ByteAll(byte2.Length+k)=byte1(k),耗时是copyTo方式的13倍,虽然如此也比Concat方式要快一倍。
测试结果是copyTo,Array.Copy,BlockCopy三种方法基本上差不多,可以随便用,不过BlockCopy稍领先,上代码:
1 private void test() 2 { 3 Stopwatch watch = new Stopwatch(); 4 byte[] byte2 = new byte[15]; 5 FileStream fs = new FileStream("z:\\3.bmp", FileMode.Open); 6 byte[] byte1 = new byte[Convert.ToInt32(fs.Length - 1)] {}; 7 fs.Read(byte1, 0, byte1.Length); 8 fs.Close(); 9 10 11 watch.Reset();12 watch.Start();13 for (int i = 0; i <= 1000; i++) {14 byte[] ByteAll = new byte[byte2.Length + byte1.Length - 1];15 byte2.CopyTo(ByteAll, 0);16 byte1.CopyTo(ByteAll, byte2.Length);17 }18 watch.Stop();19 Console.WriteLine("CopyTo模式 耗时:" + watch.ElapsedTicks.ToString());20 21 22 watch.Reset();23 watch.Start();24 for (int i = 0; i <= 1000; i++) {25 byte[] ByteAll = new byte[byte2.Length + byte1.Length - 1];26 Array.Copy(byte2, 0, ByteAll, 0, byte2.Length);27 Array.Copy(byte1, 0, ByteAll, byte2.Length, byte1.Length);28 }29 watch.Stop();30 Console.WriteLine("Array.Copy模式 耗时:" + watch.ElapsedTicks.ToString());31 32 33 watch.Reset();34 watch.Start();35 for (int i = 0; i <= 1000; i++) {36 byte[] ByteAll = new byte[byte2.Length + byte1.Length - 1];37 Buffer.BlockCopy(byte2, 0, ByteAll, 0, byte2.Length);38 Buffer.BlockCopy(byte1, 0, ByteAll, byte2.Length, byte1.Length);39 }40 watch.Stop();41 Console.WriteLine("BlockCopy模式 耗时:" + watch.ElapsedTicks.ToString());42 43 44 watch.Reset();45 watch.Start();46 for (int i = 0; i <= 1000; i++) {47 byte[] ByteAll = new byte[byte2.Length + byte1.Length - 1];48 Stream s = new MemoryStream();49 s.Write(byte1, 0, byte1.Length);50 s.Write(byte2, 0, byte2.Length);51 s.Position = 0;52 s.Read(ByteAll, 0, ByteAll.Length);53 s.Close();54 }55 watch.Stop();56 Console.WriteLine("MemoryStream模式 耗时:" + watch.ElapsedTicks.ToString());57 58 59 watch.Reset();60 watch.Start();61 for (int i = 0; i <= 1000; i++) {62 byte[] ByteAll = byte2.Concat(byte1).ToArray;63 }64 watch.Stop();65 Console.WriteLine("Concat模式 耗时:" + watch.ElapsedTicks.ToString());66 67 }
测试结果是:
CopyTo模式 耗时:194105
Array.Copy模式 耗时:192310
BlockCopy模式 耗时:190375
MemoryStream模式 耗时:755342
Concat模式 耗时:8702930
我尝试用Array.Resize(byte2, byte1.Length + byte2.Length)来直接把byte2扩大,结果测试发现还不如新建一个ByteAll来得快.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。