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

来源:互联网 发布:js上传图片跨域问题 编辑:程序博客网 时间:2024/06/05 17:17

在使用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);
(原文链接 http://ddbiz.com/?p=119)