2011-04-20 4 views
2

저는 Java로 게임 서버를 구축하고 있습니다. 네트워킹은 JBoss Netty에 의해 처리 될 것이고, JNI를 사용하여 어셈블리 코드에 대한 래퍼 인 C++ 함수를 호출하면 (NASM으로 어셈블 됨) I/O 작업이 완료 될 것입니다. 어셈블리에서뿐만 아니라 대량의 데이터를 처리 할 수 ​​있습니다. 이 접근법에 어떤 종류의 이득이 있습니까?JNI에서 메모리와 속도면에서 이점이 있습니까?

답변

5

OS에서 I/O 기능에 병목 현상이 있으며 이 아니고 I/O 속도가 향상됩니다. 또한 C++로 전환하거나 일반적으로 더 낮은 수준의 언어로 전환하지 않습니다.

성능을 향상 시키려면 을 사용하여 I/O를 피하십시오.

+0

좋아, 고마워. 하지만 JNI가 호출하는 네이티브 코드는 일반적으로 빠를까요? – Benjamin

+0

예, 조금 작았습니다. 이것은 I/O가 빠르기 때문이 아니라 변수의 일반적인 해석과 그와 같은 것이 가상 머신을 통하지 않고 기계 코드에서 직선으로 진행되기 때문입니다. 차이는 거의 없습니다. – orlp

+1

전혀. 너무 일찍 최적화하지 말고 JIT 컴파일러의 가능성을 과소 평가하지 마십시오. JIT 컴파일러가 C++ 컴파일러에서 사용할 수없는 최적화의 가능성이 있습니다. 따라서 네이티브 코드를 호출하면 실제로 혜택을 볼 수 있는지 여부는 분명하지 않습니다. 특히 자바 코드와 네이티브 코드 사이의 경계를 자주 넘어야하는 경우. – jmg

2

대소 문자를 기반으로합니다. I/O 사이에 커다란 계산/프로세스/메모리 액세스가 포함되어 Java가 C++보다 효율적으로 구현되지 않으면 예를 들어 성능이 향상됩니다. 많은 경우에, 이것은 사실입니다.

성능 향상이 특정 프로세스를 디버그하는 능력보다 중요 할 때 신중하게 생각하십시오. JNI 호출 내부에서 문제가 발생하면 어디에서 문제를 찾아내는 것이 매우 어려울 것입니다.

일반적으로 서버를 사용하면 서버 성능이 추가 하드웨어 (빠른 구성 요소, 클러스터링, 클러스터링 등)를 통해 쉽게 얻을 수 있으므로 성능 문제를 극복하기보다는 문제의 원인을 파악하고 수정하는 것이 더 중요합니다. 등) 당신이 종종 기본 하드웨어로 붙어있는 클라이언트 측 프로그램과는 다릅니다.

관련 문제