2013-02-16 9 views
3

데이터를 C++에서 C#으로 자주 전달해야합니다. 매우 낮은 대기 시간 거래 응용 프로그램을 작성 중이므로은 최대한 빨리 이어야합니다.C++에서 C#으로 데이터 전달 - 매핑 파일 대 CLI ​​+ UnmanagedMemoryStream

저는 순수한 C++ 프로젝트를 가지고 있습니다 (나중에 리눅스로 포팅 될 것입니다). 데이터를 C# 프로젝트로 전달해야합니다. 나는 항상 같은 구조를 전달해야한다 (중요하다면).

구조는 다음과 같습니다 시세 = "MSFT"가격 = "30"볼륨 = "10"사이드 =

내가 두 가지 옵션 상상 "구매"

  • 쓰기 C++ - CLI 래퍼를하는 C++에서 C#
  • 사용 메모리 매핑 된 파일
  • 에 UnmanagedMemoryStream를 전달합니다

은 무엇 일 것입니다 :

빠른3210
  • 쉽게
  • 리눅스 에 포트에
  • 쉽게 구현하는 방법?
+1

C++ 및 C# 코드는 두 개의 개별 프로세스 또는 동일한 프로세스로 끝납니다. 나는. 서로 다른 프로세스간에 또는 동일한 프로세스 내에서 관리되는/관리되지 않는 경계를 통해 데이터를 전송해야합니까? 'Linux로 이식하기'= C# 부분에 Mono를 사용 하시겠습니까? – MiMo

+0

예, 중요한 점입니다. 나는 별도의 프로세스를 가정했다. –

+0

그것은 동일한 프로젝트이고 예 나는 그것이 동일한 과정 일 수 있다고 가정합니다. 리눅스로 이식하는 것은 나머지 C# 코드를 C++로 재작 성할 가능성이 큽니다. 그러나 Mono도 가능합니다 ... 현재 라이브러리를 "독립 실행 형"응용 프로그램으로 사용하면 멋지게 느껴질 수 있습니다 (대기 시간에 크게 영향을 미치지 않는 경우). 'Ticker = "MSFT"Price = "30"Volume = "10"Side = "다른 여러 프로세스간에"구매하는 것은 멋지다.요구 사항이 모호하지만 대기 시간이 가장 중요합니다. 그러나 나는 다른 여러 프로세스와 데이터를 공유하는 것과 같은 몇 가지 멋진 기능을 가지고 있기 때문에 1 ~ 10 마이크로 초를 느슨하게하는 것에 동의합니다. – javapowered

답변

1

메모리 맵 파일은 매우 빠르고 비교적 쉽게 사용할 수 있습니다. 저는 C# 응용 프로그램에서 C++ 응용 프로그램으로 많은 양의 ECG 데이터를 전송하는 데 사용했습니다. 나는 또한 그것들을 사용하여 더 작은 메모리 블록 (예 : 구조체)을 전송했다. 프로세스 간 데이터 전송에 대해 가능한 한 빨리을 얻을 수 있습니다. (각 끝에서 데이터의 읽기/쓰기를 제어하려면 세마포어와 같은 동기화 메커니즘을 사용해야 할 것입니다.)

그러나 리눅스로 쉽게 포팅 할 수 있는지는 잘 모르겠지만 리눅스가 어떤 종류의 MMF를 지원한다는 것을 알고 있으므로 너무 어렵지는 않을 것이라고 확신합니다. 그러나 나는 확실히 말할 수 없다.

참고 : in-proc을 실행중인 DLL에서 C++ 함수로 데이터를 전송하려는 경우 완전히 다른 문제이므로 P/Invoke를 사용하면됩니다. P/Invoke를 사용하면 MMF를 사용하는 것보다 훨씬 빠릅니다 (데이터를 마샬 러가 고정 할 수 있고 복사 할 필요가 없다고 가정). 일반적으로 P/Invoke를 사용하면 C++ 함수에 대한 포인터를 전달할 수 있습니다.

+0

내 지식 P/Invoke가 비교적 느립니다. SLOW는 비교적 느립니다. CLI 호출이 더 빨라야합니다! – javapowered

+0

아니요, 마샬 러가 메모리를 복사하지 않아도 P/Invoke가 느려지지 않습니다. 그것은 단지 관리되지 않는 DLL에 대한 포인터를 전달해야합니다 (통과하는 메모리 블록을 고정한 후에). MMF 기능을 사용하여 메모리 블록을 복사하는 것과 비교하면 훨씬 빠릅니다. –

+0

"즉, C++ Interop은 가능한 가장 빠른 데이터 마샬링 방법을 사용하는 반면 P/Invoke는 가장 강력한 방법을 사용합니다. 즉, C++ Interop (C++의 일반적인 방식)는 기본적으로 최적의 성능을 제공하며 프로그래머는 이 행동이 안전하지 않거나 적절하지 않은 경우를 다룰 책임이 있습니다. " 여기에서 : http://msdn.microsoft.com/en-us/library/ky8kkddw(v=vs.80).aspx – javapowered

2

모노 모드에서는 혼합 모드 C++/CLI 어셈블리를 사용할 수 없습니다 (here 참조). Mono는 순수 CLR C++ 어셈블리 만 지원합니다.
따라서 메모리 매핑 파일이나 Matthew가 (Mono에서 지원되는) P/Invoke를 사용하여 제안한 다른 가능성은 Linux로 이식하려는 경우 사용해야하는 것입니다.