2010-07-13 3 views
3

클라이언트에서 C++ 응용 프로그램의 C# 및 Java에서 사용할 수있는 API를 호출해야하는 솔루션을 모색 중입니다. 우리는 이것을 크로스 플랫폼 응용 프로그램 (PC & Mac)으로 만들기를 원하므로 Java가 선호되지만 성능이 더 중요합니다. 나는 C#에서 Java에 대한 C++ 호출의 성능에 대한 연구를 시도했지만 솔리드 정보를 찾지 못했습니다. 아이디어는 JNI를 사용하여 Java API 또는 관리되는 C++을 호출하여 C# API를 호출하는 것입니다.Java 코드 대 C# 코드 호출 성능 C# 코드

성능면에서 현명한 방법에 대한 정보 나 통찰력이있는 사람이 있습니까? 이러한 호출은 잠재적으로 많이 수행되므로 볼륨이 작동합니다.

감사합니다.

+0

afaik JNI를 사용하여 C/C++에서 Java를 호출 할 수 없습니다. 다른 방법 : JNI를 사용하면 C/C++로 작성된 라이브러리를 호출 할 수 있습니다. – musiKk

+4

JNI를 사용하면 JVM을 인스턴스화하고 C에서 전화를 걸 수 있습니다. –

+0

C++에서 Java를 호출 할 수 있지만 성능이 중요 할 경우 호출 횟수를 줄이십시오. 대부분의 작업을 재구성하여 호출 횟수를 줄일 수 있습니다. 코드가 잘 작성되면 이러한 호출의 비용은 중요하지 않습니다. JNI의 경우 비용은 약 30 클럭 사이클이 될 수 있지만, 실제로 당신이하는 일에 달려 있습니다. –

답변

3

확실한 답을 줄 수는 없지만 JNI를 C 라이브러리 호출 (반대가 아닙니다), .NET 라이브러리를 래핑하는 .NET 및 .NET 라이브러리 호출을 수행했습니다. 그 중 어떤 것에도 공식적인 번호는 없지만 .NET에서 .NET으로의 호출은 관리되는 C++이든 C#이든 가장 쉽고 빠릅니다. 둘 다 .NET 이었기 때문에 양쪽에서 지원되는 공통 데이터 유형 세트가있었습니다. 다른 경우에는 다른 언어로 된 데이터 유형간에 변환하는 데 필요한 많은 못생긴 마샬링 코드가있었습니다. .NET Framework는 서로 다른 .NET 라이브러리 간의 호출이 원래 언어를 투명하게 할 수 있도록 설계되었으며 매우 잘 수행됩니다.

대용량 환경에서 개별 라이브러리의 성능이 interop 성능보다 큰 우려가 될 수 있다는 또 다른 고려 사항이 있습니다. 즉, Java 라이브러리가 C# 라이브러리보다 25 % 빠르면 C#을 사용하는 interop이 Java보다 빠르고 쉽지만 Java 라이브러리를 사용하는 것이 좋습니다.

1

C#과 Java API가 동일하다고 가정합니다. 저는 C#과 Java가 interop/JNI를 통해 동일한 C++ 라이브러리와 대화해야했던 환경에서 작업했습니다. API가 상당히 혼란스럽고 많은 일시적인 객체를 생성하기 때문에 Java 버전이 성능면에서 일관성이있는 것 같습니다.

이 우리의 호출이 어떻게 생겼는지입니다 : ... theCPPWrapper.GetField(string)

double myDouble= theCPPWrapper.GetField("foo").AsDouble(); 

는 JNI Field 클래스와 아무것도 상호 운용성의 또 다른 층을 통과하는 Field.AsDouble() 방법을 반환

는 그래서 GC이었다 일시적인 필드 객체로 가득 차서 Java가 어떻게 든 잘 대처하는 것처럼 보였습니다.

은 결국 수정 따라서 찾기 위해 JNI/상호 운용성 API를 변경했다 : 네이티브 API가 불필요하게 수다없는, 또는 GC가 겪게 될 것이다 당신이 고려해야 무엇이든

double myDouble = theCPPWrapper.GetFieldAsDouble("foo"); // no transient Field. Yay! 

먼저 확인하시기 바랍니다.

건배,

0

플로리안 당신은 내가 모든 호출을 분리하는 추상화 계층의 사용을 제안 모든 언어 사이의 여러 복잡한 통화를 관리됩니다.

CORBA와 XML-RPC를 동일한 상황에서 성공으로 사용했지만 둘 다 잘 지원/문서화되었습니다. 그러나 그들은 선택의 앞에 당신이 공부할 찬성 & 단점이 있습니다.

0

C/C++과 Java를 비교하는 벤치 마크가 많이 있습니다.(두 번째 것은 C#도 포함합니다.) 참고 : 이것들은 단지 벤치 마크 일 뿐이므로 소금으로 채취해야합니다. 하나의 환경에서 최선을 다하고

http://www.idiom.com/~zilla/Computer/javaCbenchmark.html
http://reverseblade.blogspot.com/2009/02/c-versus-c-versus-java-performance.html

변환 층을 통과에 비해 빠른 항상. 물론 원격 호출을 시작하면 항상 더 느려질 것입니다. 아이디어는 누화를 시도하는 경우 세분성을 높게 유지하는 것입니다.

-1

Mac에서 C# 코드를 호출하기위한 계획은 무엇입니까? 또는 Mac에서 Java를 사용하고 Windows에서 C#을 사용 하시겠습니까? 기꺼이 지원 요구 사항에 대해 궁금한 점이 있습니다. 관리되지 않는 C++에서 관리 C++을 호출하는 것이 매우 효율적이라고 기대하지만, 필자는 결코 그것을 수행하지 못했다고 고백합니다.

+0

기본적으로 Java API를 사용하여 Windows와 Mac을 모두 지원하거나 C#을 사용하고 Windows 만 지원합니다. 클라이언트는 Mac 지원을 원하지만 성능은 환경보다 우선합니다. – wezman

+0

C#은 Mac에서 사용할 수 있습니다. –

+0

적어도 .NET 1.0, 1.1 및 2.0 시대에는 CLR 및 명령 줄 (csc) 컴파일러를 Mac 용으로 다운로드 할 수있었습니다. System.Windows.Form. *을 제외한 모든 것이 사용 가능했습니다. –

0

C# -to-Java에 대한 측정 항목이 없습니다. 그러나 우리는 C++ - to - Java를 호출하는 많은 경험을 가지고 있습니다. 모든 클래스와 메소드 ID를 캐시 한 후에도 매우 느립니다. C++/JNI 호출은 약 1000 클럭 사이클을 소요하는 것으로 보이며 약 3M 호출/초를 한도로 관측했습니다. 이 때문에 한 번의 호출로 데이터 블록을 Java로 전송하는 것과 관련된 여러 가지 반복 최적화 과정을 거쳤습니다. 또한 Java 예외를 확인하거나 반환시 예외 상태를 다시 설정해야합니다. 이로 인해 또 다른 오버 헤드가 추가됩니다.

반면 Java에서 C++을 호출하는 것은 엄청나게 빠릅니다. 대신 할 수 있다면해라. Java 및 C++ 컨트롤을 반전하는 "연속"과 관련된 몇 가지 고급 기법이 있습니다. 이것은 다음과 같습니다 :

C++ -> Java: Start the continuation loop 
    Java: while some condition 
     Java -> C++: What do you want me to do 
     C++: please do this action for me 
     Java does the action 

이 제어 반전은 많은 (대부분의) 응용 프로그램에는 적합하지 않지만 또 다른 아이디어입니다. 다양한 RPC 접근법을 고려해 볼 수도 있지만, 이들은 또한 매우 천천히 (1M/초 정도) 최대화되는 경향이 있습니다.