C# 网络接口中byte转int 结构体内存对齐解析效率的比较

最近有个活 需要把网络数据进行解析转换,同时对性能有较高的要求。以前在delphi中 通过结构体 变体可以提高一些效率,代码如下:

{$REGION '4位16进制与smallInt转换结构体'}
TWordOfInt = array[0..1] of WORD;

TByteOfInt = array[0..3] of Byte;

TIntRec = packed record ////定义一个辅助类型,这样转换非常快,而且方便
case Integer of
0:
(IntValue: Integer);
1:
(Low, High: Word);
2:
(Words: TWordOfInt);
3:
(Bytes: TByteOfInt);
4:
(sIntL, sIntH: SmallInt);
end;
{$ENDREGION}

//数据转换

var
value:TIntRec;

iValue:Integer

Buff:System.SysUtils.TByteArray;

//Buff 数据赋值

value.Bytes[0]:=Buff[1];
value.Bytes[1]:=Buff[0];
iValue:=value.sIntL;//这样就用byte数组得到了一个整形

 

 

比较了以下两种方式,发现并没有多大差异,玩了个寂寞……

[StructLayout(LayoutKind.Explicit)]
public struct IntStruct
{
[FieldOffset(0)]
public int IntValue;

[FieldOffset(0)]
public byte ByteLL;

[FieldOffset(1)]
public byte ByteLH;

[FieldOffset(2)]
public byte ByteHL;

[FieldOffset(3)]
public byte ByteHH;
}

 

 

private void btnTest_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
try
{
sw.Start();
//接口返回的原始数据
byte[] byteValue = { 101, 57, 48, 51, 48, 48, 48, 48 };//1001

for (int i = 0; i < 100000000; i++)
{
/*
//方式1 直接转换
//string sValue = "e9030000";//1001
//string sValue = "094fbc00";//12341001
string sValue = Encoding.UTF8.GetString(byteValue, 0, 8);
int iValue = Convert.ToInt32(sValue.Substring(6, 2) + sValue.Substring(4, 2) +
sValue.Substring(2, 2) + sValue.Substring(0, 2), 16);
*/
//第一次耗时:17986
//第一次耗时:18008
//第三次耗时:17736

//方式2 结构体内存对齐
IntStruct a = new IntStruct();
//数据是asscii码 需通过char转换
//a.ByteLL = Convert.ToByte(new string(new char[] { (char)byteValue[0], (char)byteValue[1] }), 16);
//a.ByteLH = Convert.ToByte(new string(new char[] { (char)byteValue[2], (char)byteValue[3] }), 16);
//a.ByteHL = Convert.ToByte(new string(new char[] { (char)byteValue[4], (char)byteValue[5] }), 16);
//a.ByteHH = Convert.ToByte(new string(new char[] { (char)byteValue[6], (char)byteValue[7] }), 16);
//第一次耗时:17455
//第一次耗时:17141
//第三次耗时:19225
//第四次耗时:18424
int iValue = a.IntValue;

}
}
catch(Exception ex)
{
MessageBox.Show("异常:"+ex.Message);
}
finally
{
sw.Stop();
MessageBox.Show("耗时:" + sw.ElapsedMilliseconds); //输出:消耗的毫秒
//MessageBox.Show(sw.Elapsed.ToString());//输出:时:分:秒
}
}

 

posted on 2024-06-26 15:28  金宝的博客  阅读(35)  评论(0)    收藏  举报

导航