릴리즈 버전을 기준으로 할 때 unsafe가 제일 빠르다.

 

디버그 버전

 

 BitConverter

 50 ms

 Marshal

 802 ms

 unsafe

 140 ms

 

 

릴리즈 버전

 

 BitConverter

 49 ms

 Marshal

 631 ms

 unsafe

 32 ms

 

 

테스트 코드

class Program
{
 const int COUNT = 1000000;
 static void Main(string[] args)
 {
  var basearray = Enumerable.Range(0, 1024).Select(x => (byte)x).ToArray();

  var sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BitConverter.ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"BitConverter {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = BtoS<Int64>(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"Marshal {sw.ElapsedMilliseconds}ms");

  sw = Stopwatch.StartNew();
  for (var i = 0; i < COUNT; i++)
  {
   var buffer = ToInt64(basearray, 2);
  }
  sw.Stop();

  Console.WriteLine($"unsafe {sw.ElapsedMilliseconds}ms");

 

  Console.ReadKey();
 }

 private static T BtoS<T>(byte[] bytes, int startIndex) where T : struct
 {
  GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
  T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject() + startIndex,
   typeof(T));
  handle.Free();
  return stuff;
 }

 unsafe static void PutBytes(byte* dst, byte[] src, int start_index, int count)
 {
  for (int i = 0; i < count; i++)
   dst[i] = src[i + start_index];
 }

 unsafe static Int64 ToInt64(byte[] bytes, int startIndex)
 {
  Int64 ret;

  PutBytes((byte*)&ret, bytes, startIndex, 8);

  return ret;
 }

}

 

 

출처: http://qiita.com/yu_ka1984/items/fa403894af35a3f3925c

 

 

저작자 표시
신고
by 흥배 2016.01.20 09:00
| 1 |

티스토리 툴바