private static void Main(string[] args) { var array = new ushort[2048]; for (var i = 0; i < 256; ++i) { array[i] = 0; } for (var i = 256; i < 512; ++i) { array[i] = 1; } for (var i = 512; i < array.Length - 512; ++i) { array[i] = (ushort)i; } for (var i = array.Length - 512; i < array.Length; ++i) { array[i] = 2; } const int repeat = 10; var sideEffect = 0; var lens = new[] { 1, 3, 5, 10, 20, 30, 45, 60, 100, 200, 300, 500, 1000, array.Length }; foreach (var len in lens) { Console.WriteLine("Len - {0}", len); Timing("\tIndexOf16 Managed", 3, () => { var counter = 0; for (var _ = 0; _ < repeat; ++_) { for (var off = 0; off <= array.Length - len; ++off) { for (var v = 0; v < array.Length; ++v) { counter += IndexOf16_Managed(array, len, (ushort)v); } } } Volatile.Write(ref sideEffect, sideEffect + counter); }); Timing("\tIndexOf16", 3, () => { unsafe { fixed(ushort *p = array) { var counter = 0; for (var _ = 0; _ < repeat; ++_) { for (var off = 0; off <= array.Length - len; ++off) { for (var v = 0; v < array.Length; ++v) { counter += IndexOf16(p, len, (ushort)v); } } } Volatile.Write(ref sideEffect, sideEffect + counter); } } }); Timing("\tNative IndexOf16", 3, () => { unsafe { fixed(ushort *p = array) { var counter = 0; for (var _ = 0; _ < repeat; ++_) { for (var off = 0; off <= array.Length - len; ++off) { for (var v = 0; v < array.Length; ++v) { counter += Native.IndexOf16((IntPtr)p, len, (ushort)v); } } } Volatile.Write(ref sideEffect, sideEffect + counter); } } }); Timing("\tNative IndexOf16_SSE2", 3, () => { unsafe { fixed(ushort *p = array) { var counter = 0; for (var _ = 0; _ < repeat; ++_) { for (var off = 0; off <= array.Length - len; ++off) { for (var v = 0; v < array.Length; ++v) { counter += Native.IndexOf16_SSE2((IntPtr)p, len, (ushort)v); } } } Volatile.Write(ref sideEffect, sideEffect + counter); } } }); Timing("\tNative IndexOf16_AVX", 3, () => { unsafe { fixed(ushort *p = array) { var counter = 0; for (var _ = 0; _ < repeat; ++_) { for (var off = 0; off <= array.Length - len; ++off) { for (var v = 0; v < array.Length; ++v) { counter += Native.IndexOf16_AVX((IntPtr)p, len, (ushort)v); } } } Volatile.Write(ref sideEffect, sideEffect + counter); } } }); } }