2009-12-07 3 views
0

오늘 나는 바이트 배열에 기본적으로 쓰는 가벼운 메모리 스트림을 만들었습니다. 난 내가 어떤 차이가 있는지 두 사람을 벤치 마크 거라고 생각 - 그리고이 있었다 :C# - 기본 라이브러리의 성능이 더 좋습니까?

MemoryStream을 (배열에 1 바이트를 작성) : 1.0001ms에게 내 : 3.0004ms를

모두가 나에게 말한다 MemoryStream은 기본적으로 바이트 배열과 함께 작업 할 수있는 메소드를 제공합니다.

내 질문 : 기본 C# 라이브러리는 우리가 작성한 코드보다 약간 우수한 성능을 갖고 있습니까? (아마도 디버그가 아닌 릴리즈에서 실행됩니다.)

+0

벤치 마크에 사용 된 코드를 게시 하시겠습니까? – Juliet

답변

4

. NET 구현은 아마도 자신보다 조금 나아 졌을뿐만 아니라 어떻게 벤치 마크 했습니까? 2 백만회 반복 또는 몇 가지? 잘못된 결과를 가져올 수있는 일부 데이터 (CPU가 잠시 동안 호출되는 등)를 제거 할 수 있도록 대형 테스트 기반을 사용해야 함을 기억하십시오.

0

Id의 베팅은 Microsoft의 구현이 사용자보다 조금 나아졌습니다. ;)

출처를 확인 했습니까?

2

Microsoft의 사람들은 당신과 내가하는 것보다 훨씬 똑똑하며 Byte[] 이상의 최적의 래퍼를 만들었을 가능성이 큽니다.

궁금한 점이 있다면 Microsoft에서 정확히 구현 한 유형을 확인하기 위해 다시 만든 유형을 디스 어셈블리하는 것이 좋습니다. 프레임 워크의 중요한 부분 중 일부 (예 : 상상할 수 있음)에서 BCL은 목표를 달성하기 위해 관리되지 않는 코드를 호출합니다.

관리되지 않는 코드는 관리 런타임의 오버 헤드없이 (경계 검사 등을 위해) 배열을 사용하여 자유롭게 작업 할 수 있으므로 이와 같은 경우 관리 코드보다 성능이 월등히 우수합니다.

2

많은 프레임 워크 어셈블리가 NGENed이기 때문에 초기 JIT 시간을 우회하여 작은 부스트를 줄 수 있습니다. 이것은 스톱워치를 시작하기 전에 이미 방법을 예열 한 경우 특히 2ms 차이의 원인이 될 것 같지 않지만 완전성을 언급합니다.

또한 예, 프레임 워크 어셈블리는 "디버그"가 아닌 "릴리스"모드 (최적화 및 확인) 모드로 빌드됩니다.

+0

"체크 오프"란 무엇을 의미합니까? – TheAJ

+0

C#은 체크 또는 체크되지 않은 모드에서 산술 연산을 수행 할 수 있습니다. 체크 된 모드에서는 오버플로가 예외 (예 : Int32.MaxValue + 1 throw)를 발생시키고 체크되지 않은 모드에서는 랩됩니다 (Int32.MaxValue + 1은 Int32.MinValue를 반환합니다). 기본 모드는 컴파일러 설정입니다 (checked 및 unchecked 키워드를 사용하여 코드에서 재정의 할 수 있음). 그러나 기본적으로 디버그 빌드가 선택되었는지는 잘못되었을 수 있습니다. 디버그 빌드도 기본적으로 선택되지 않은 것처럼 보입니다. 미안합니다. – itowlson

2

더 빠른 Buffer.BlockCopy() 대신 Array.Copy()을 사용했을 가능성이 큽니다. 가장 빠른 방법은 포인터로 안전하지 않은 코드를 사용하는 것입니다. Mono 프로젝트에서 how they do this을 확인하십시오 (memcpy 검색).

관련 문제