三种数据转换的执行效率比较

在使用Socket进行数据传输中, 最重要的一个注意项,是我们需要关注 网络自己顺序, 本文使用了3中字节顺序转换方式,他们的执行效率有较大差别,如果你的系统比较繁忙的话,不妨考虑更有效的代码(原文链接 http://ddbiz.com/?p=119)

 

1. IPAddress

 

使用 IPAddress.HotToNetworkOrder 可以对整形进行字节顺序的转换

 

2. 指针操作, 如:

    unsafe{

int dest =0;         

byte * bs = (byte*) &src, bd = &dest;

        bd[0] = bs[3]; bd[1] = bs[2]; bd[2] = bs[1]; bd[3] = bs[0];       

    }

 

3. 位移操作

 

    dest = ( (src & 0xFF000000) >> 24) |

               ( (src & 0x00FF0000) >> 8) |

               ( (src & 0x0000FF00) << 8) |

               ( (src & 0x000000FF) << 24)

 

通过测试(见测试代码), 指针操作为最快的一种,其次就是位移操作,这两种运算方式都比 IPAddress的方式要快一倍以上.

***** test.test.Efficiency

IPAddress used: 223 ms

byte* used: 110 ms

shift used: 122 ms

 

***** test.test.Efficiency

IPAddress used: 219 ms

byte* used: 110 ms

shift used: 122 ms

 

***** test.test.Efficiency

IPAddress used: 221 ms

byte* used: 108 ms

shift used: 121 ms

 

***** test.test.Efficiency

IPAddress used: 181 ms

byte* used: 147 ms

shift used: 160 ms

 

***** test.test.Efficiency

IPAddress used: 290 ms

byte* used: 140 ms

shift used: 170 ms

附测试代码:
Stopwatch sw = new Stopwatch();
            int count = 10000000;
            int[] ar = new int[count];
            Random rd = new Random((int)DateTime.Now.Ticks);
            for (int i = 0; i < count; i++)
            {
                ar[i] = rd.Next();
            }
            sw.Start();
            for (int i = 0; i < count; i++)
            {
                int a = ar[i];
                IPAddress.HostToNetworkOrder(a);
            }
            sw.Stop();
            Console.WriteLine("IPAddress used: {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
            sw.Start();
            unsafe
            {
                fixed (int* iar = ar)
                {
                    byte * bar = (byte*) iar;
                    for (int i = 0; i < count; i++)
                    {
                        int a;
                        byte *bi = (byte*)&a;
                        bi[0] = bar[3]; bi[1] = bar[2]; bi[2] = bar[1]; bi[3] = bar[0];
                        bar += 4;
                    }
                }
            }
            sw.Stop();
            Console.WriteLine("byte* used: {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
            sw.Start();
                for(int i =0; i< count; i++)
                {
                    uint a = (uint)ar[i];
                    a = ( (a & 0xFF000000) >> 24) | ( (a & 0x00FF0000) >> 8) | ( (a & 0x0000FF00) << 8) | ( (a & 0x000000FF) << 24);
                }
            sw.Stop();
            Console.WriteLine("shift used: {0} ms", sw.ElapsedMilliseconds);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值