2014-09-23 6 views
7

.NET에서 MemoryMappedFile s의 메모리에 대해 연동 연산 (CompareExchange, Increment 등)을 사용해야합니다..NET에서 MemoryMappedFiles에 대해 x64 연동 연산을 사용하는 방법

매우 비슷한 질문으로이 answer을 발견했습니다. 문제는 Interlocked Operations가 64 비트 OS에서 kernel32 (또는 기타) dll에서 내 보내지 않은 것입니다 (예 : http://blog.kalmbachnet.de/?postid=46 참조).

64 비트 .NET 프로세스에서 메모리 블록에 인터록 된 함수를 호출하는 다른 방법이 있습니까?

+1

나는 인터럽트 된 함수를 호출하는 내포 된 함수로 내 자신의 C Dll을 작성하려고 시도 할 것이고 .NET에서 호출 할 것이다. –

+0

@AlexFarber Excelent point! 나는 이것에 대해 묻기 만했다 :) 컴파일러 본질적인 연동 함수 (예 : [http://msdn.microsoft.com/en-us/library/2ddez55b = vs.80) .aspx] (http://msdn.microsoft.com/en-us/library/2ddez55b(v=80) .aspx))? 따라서 ASM 코드를 스스로 재발견 할 필요가 없습니다. – Jan

+2

이 작업을 수행 할 필요가 없습니다. 네이티브 DLL에서 필수 기능을 호출하면 컴파일러가 나머지 작업을 수행합니다. 내 말은, 당신이 필요로하는 각각의 연동 함수에 대해 연동 함수를 호출하는 내 보낸 Dll 함수를 작성한다는 것입니다. –

답변

1

관리 코드에 의해 소모되는 연동 연산을 제공하는 작은 C++/CLI 도우미 라이브러리를 작성하십시오.

가장 빠른 interop 경로는 내부적으로 인터럽트 된 내장 함수를 사용하는 관리되지 않는 함수를 호출하는 관리되는 클래스를 노출하는 것입니다. 그렇게하면 PInvoke를 통과 할 필요조차 없습니다.

+0

불행히도 이것은 사실이 아닙니다. C++/CLI는 억제 된 검사를 사용하는 P/Invoke보다 느립니다. 여기에서 : http://www.codeproject.com/Articles/253444/PInvoke-Performance?msg=4551831#xx4551831xx 또는 여기에서 : http://www.xinterop.com/index.php/2013/05/01/ccli- vs-pinvoke-performance-part-one/ 그래서 P/Invoke가 가야할 길입니다. (불행히도 각 호출마다 12 가지 이상의 명령어를 사용합니다) – Jan

+0

첫 번째 기사에서는 C++ 래퍼가 더 빠름을 보여줍니다. 두 번째 기사에서는 C++ 래퍼가 너무 느려서 내가 의심스러워지기 시작합니다. 어쩌면 최적화가 켜지지 않았거나 추가 작업이 수행되었을 수도 있습니다. (실제로 C++ 래퍼는 중간 클래스를 통해서만 sqrt를 호출합니다. 왜?). 두 기사에서 벤치 마크 시간은 매우 작았습니다. 엄청난 소음. DateTime.Now는 그다지 정확하지 않습니다. 일반적으로 15ms 단위로 증가합니다. 그의 테스트는 10-30ms 범위였습니다. 나는 어느 쪽의 기사도 신뢰하지 않는다. 그리고 나는 더 많이 조사 할 시간을 투자하지 않을 것이다. – usr

+0

나는 귀하의 연구 결과에 동의합니다. 가장 중요한 점은 최대 속도를 원할 경우 관리되는 <-> 네이티브 전환과 관련된 모든 스택 추적 조사 등을 지원해야한다는 것입니다. P/Invokes를 사용하면 SuppressUnmanagedCodeSecurity 특성을 지정하여이 작업을 수행 할 수 있습니다. C++/CLI 래퍼를 사용하면 기본적으로 모든 검사를 수행하며 단축키를 사용할 수 없다는 것을 알고 있습니다. – Jan