int回転byte[]の関連方法と適用シーン

9413 ワード

c#でintをbyte[]に変換するにはBitConverterが一般的です.GetBytesは入手できますが、BitConverterでは呼び出すたびに新しいbyte[]が生成されるという問題があります.もしあなたが執着しているなら、以下の2つの方法でこれらを節約することができます.
BitConverterからコードを盗み出して、勉強して:)、まずBitConverterを見てください.GetBytes intの方法について
1 public unsafe static byte[] GetBytes(int value)
2 {
3 byte[] array = new byte[4];
4 fixed (byte* ptr = array)
5 {
6 *(int*)ptr = value;
7 }
8 return array;
9 }

次のように変更できます.
 1   public class IntToBytes2
2 {
3 private byte[] m4byteData = new byte[4];
4
5 public unsafe byte[] ToBytes(int value)
6 {
7 fixed (byte* ptr = m4byteData)
8 {
9 *(int*)ptr = value;
10 }
11 return m4byteData;
12 }
13 }

もう1つは構造を定義することです
 1     public class IntToBytes1
2 {
3 private byte[] m4byteData = new byte[4];
4 private Switcher mData;
5 public byte[] ToBytes(int value)
6 {
7 mData.intVal = value;
8 m4byteData[0] = mData.b0;
9 m4byteData[1] = mData.b1;
10 m4byteData[2] = mData.b2;
11 m4byteData[3] = mData.b3;
12 return m4byteData;
13 }
14 [StructLayout(LayoutKind.Explicit)]
15 struct Switcher
16 {
17 [FieldOffset(0)]
18 public int intVal;
19 [FieldOffset(0)]
20 public byte b0;
21 [FieldOffset(1)]
22 public byte b1;
23 [FieldOffset(2)]
24 public byte b2;
25 [FieldOffset(3)]
26 public byte b3;
27 }
28 }

実はもう一つはシフトによって実現されるもので、ここではあまり言わない.
効果を簡単にテストし、Releaseにコンパイルしてexeを単独で実行することをお勧めします.結果でなければ大きな違いがある可能性があります.
 1 IntToBytes1 t1 = new IntToBytes1();
2 IntToBytes2 t2 = new IntToBytes2();
3 System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
4 sw.Reset();
5 sw.Start();
6 for (int i = 0; i < 9999999; i++)
7 {
8 BitConverter.GetBytes(i);
9 }
10 sw.Stop();
11 Console.WriteLine(sw.Elapsed.TotalMilliseconds);
12 sw.Reset();
13 sw.Start();
14 for (int i = 0; i < 9999999; i++)
15 {
16
17 t1.ToBytes(i);
18 }
19 sw.Stop();
20 Console.WriteLine(sw.Elapsed.TotalMilliseconds);
21 sw.Reset();
22 sw.Start();
23 for (int i = 0; i < 9999999; i++)
24 {
25
26 t2.ToBytes(i);
27 }
28 sw.Stop();
29 Console.WriteLine(sw.Elapsed.TotalMilliseconds);

実行結果はそれぞれ208 ms,148 ms,150 msであった.結果から見るとカスタマイズの2つは速いようで、細心の友达が見た後、このようなテストが不公平であることに気づくべきだ.まずBitConverterメソッド自体はスレッドが安全で、他の2つはそうではありません.他の2つの方法が使用するたびに定義された結果が全く異なる場合、BitConverterが最も効率的であると推定されます(興味のある方は方法の下で).カスタマイズされた方法が定義された後に一定の回数を使用すると、BitConverterよりも明らかに価値が得られます.例えば、ネットワーク通信の時計回りに接続を割り当てた後のすべての変換が彼を使用すると、価値が現れます.
実はNetframeworkにはBitConverterだけでなくEncodingが特によく使われています.GetBytesはこの方法で処理され、stringもあります.toCharArrayなどは高密度の処理時に大量に新しいbyte[]とchar[]を構築する.これらの詳細に関心を持っている場合は、これらのオブジェクトの方法を多く見て、いくつかの道を通じてこれらの問題を解決します.これは処理効率を向上させるだけでなく、GCの仕事を解放することもできます.