linq, ArrayCopy, BlockCopy, marshal 중 BlockCopy가 제일 빠름


테스트 코드

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 = basearray.Skip(20).Take(20).ToArray();

}

sw.Stop();


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


sw = Stopwatch.StartNew();

for (var i = 0; i < COUNT; i++)

{

var buffer = new byte[20];

Array.Copy(basearray, 20, buffer, 0, 20);

}

sw.Stop();


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


sw = Stopwatch.StartNew();

for (var i = 0; i < COUNT; i++)

{

var buffer = new byte[20];

Buffer.BlockCopy(basearray, 20, buffer, 0, 20);

}

sw.Stop();


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



sw = Stopwatch.StartNew();

var ptr = Marshal.AllocCoTaskMem(basearray.Length);

Marshal.Copy(basearray, 0, ptr, basearray.Length);

try

{


for (var i = 0; i < COUNT; i++)

{

var buffer = new byte[20];

Marshal.Copy(ptr + 20, buffer, 0, 20);

}

}

finally

{

Marshal.FreeCoTaskMem(ptr);

}

sw.Stop();


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


Console.ReadKey();

}


결과

linq          1622ms

ArrayCopy   71ms

BlockCopy  55ms

marshal      62ms



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

저작자 표시
신고
by 흥배 2016.02.05 08:12

예전에  http://jacking.tistory.com/154 이 글을 통해서 간단하게 VC++의 연관 컨테이너의 성능을 테스트해 본적이 있습니다.

그 때는 VC++ 9 환경에서 테스트를 했는데 이번에는 VC++ 11(RC)에서 테스트 해 보았습니다.

그때 사용했던 코드를 거의 그대로 사용했습니다(그래서 손 볼 것이 좀 있습니다^^;)


성능은 역시나(?) CAtlmap이 제일 빠릅니다. 또 unordered_map이 이전에 비해서 많이 빨라졌네요

일전에 VC++ 팀 블로그에서 성능이 개선되었다고 하던데 맞네요


코드를 올리니 혹시 관심 있는 분들은 좀 더 다양하게 테스트 해보시고 공유 부탁합니다^^





ContainerPerformance.zip


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