Array.Copy内部直接调用了windows api实现,已经非常快了。至少FCL中不会有比这个更快的了。还有一个仅仅是在理论上会比它快一点,就是Buffer.BlockCopy:
var all = new byte[data1.Length + data2.Length];
Buffer.BlockCopy(data1, 0, all, 0, data1.Length);
Buffer.BlockCopy(data2, 0, all, data1.Length * sizeof(byte), data2.Length);
说Buffer.BlockCopy理论上稍微快一点点是因为:
//Buffer.Copy本身就是直接的api调用
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]
public static extern void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count);
//Array.Copy几经辗转最终到了这个方法
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical, ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
internal static extern void Copy(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length, bool reliable);
如果真的有空应该写个小程序测试一下。虽然我认为区分这两者的速度差异真的没什么大意义。
byte[] data1 = {0x12, 0x13, 0x14};
byte[] data2 = {0x15, 0x16, 0x17};
var data3 = new byte[data1.Length + data2.Length];
Stream s = new MemoryStream();
s.Write(data1, 0, data1.Length);
s.Write(data2, 0, data2.Length);
s.Position = 0;
int r = s.Read(data3, 0, data3.Length);
if (r > 0)
{
//此时data3中就是合并的值了
}
一楼的方法使用了stream,相应的会有一定开销。
二楼的方法直接操作buffer,相对于stream开销少很多。
小数据,二楼的方法效率会高些。
大数据,最好还是用一楼的方法。