여러 테스트 케이스 3 개 국어 (C ++, 자바, C #을) 관점에서 성능 최적화 성능

       시간이 지남에 따라, 현재 가상 머신 기술은 어떤 경우에, 자바, 닷넷과 다른 가상 머신 집약적 인 컴퓨팅 성능이 더욱 뛰어난 개인의 경우 C ++와 유사한왔다, 더 성숙된다. 이 논문은 현상의 뒤에 이유를 탐구하는 몇 가지 테스트 케이스의 성능을 분석한다.

       두 가지 간단한 테스트 케이스 봐. 연속 운전 LEN = 1000000 메모리 5000 사이클은 아래 제시된, 상기 실행 시간을 계산한다. 왼쪽 TEST1, 오른쪽 TEST2.

       .NET 3.0 Preview6 코어 시험 유사한 절차.

       테스트 결과는 다음과 같습니다 비교 :

       우리는 TEST1를 들어 볼 수 있습니다, C ++ 버전은 TEST2를 들어, 훨씬 빠릅니다, C # 및 또는 조금이라도 더 빠른 C ++ 버전 버전 동등한 성능.

       왜 이러한 현상이있다? 다음과 같은 특정 분석 :

       TEST1 할당주기 위치에 독립적이며, 따라서 컴파일러 및 다른 병렬 SIMD 연산 명령에 의해 최적화 될 수있다, 등을 최적화하기 위해 SIMD 병렬 컴퓨팅 명령어를 사용하기 어려운 위치 의존성 컴파일러 순환 TEST2 할당. 이상의 결과, VC 컴파일러에서 추측 할 수없는 3.0 preview6 TEST1 병렬 최적화 TEST1 평행 최적화 및 .NET 코어되었다.

       우리는이 추측을 확인합니다. .NET 코어 3.0 SIMD 명령어 매뉴얼 이하, TEST1 병렬 최적화 테스트 성능을위한 지원을 제공한다 :

 

       결과는 0.441s의 C ++ 버전에 가까운 0.633s이다. 2.289s 전면에 대하여, 3 회 이상 속도 최적화.

       동일한 절차 나 자바 (8) 테스트 결과 서프라이즈를 사용 :

 

       TEST1 0.654s, 및 .NET 코어 병렬 최적화 근사 소비, 우리는 가상 머신 JVM 병렬 최적화를 실시하고 볼 수 있습니다. TEST2 1.755s, C ++ 버전과 .NET의 핵심 버전보다 빠르고, 큰 격차를 소모!

 

       显然,jvm对test2这种情况进行了特殊关照。要理解这一现象,就需要对Java虚拟机的机制有深入了解。HotSpot 虚拟机里内置了两个JIT编译器:Client Compiler和Server Compiler,简称为C1编译器和C2编译器。C1编译器将字节码编译为本地代码,进行简单、 可靠的优化,如有必要将加入性能监控的逻辑。C2编译会启用一些编译耗时较长的优化,甚至进行一些激进优化。

       查找文献可知,默认情况下,当方法调用次数+循环回边次数超过10000、计数器是int等几个简单类型、步增是常量时,会触发C2编译优化。test2恰恰满足这三种情况!

       下面我们再设计一个实验,将步增改为变量,看看测试结果:

       由测试可知,将步增改为变量后,测试结果为6.163秒,和C++及 .net core 测试结果近似。

       针对这个测试案例,可以猜测 C2 优化时进行了循环展开。下面,我们在 .net core 下手动展开循环,测试性能,验证我们的猜想:

 

       测试结果为1.983s,近似java8的1.755s。猜想得到验证。

 ----

       总结:随着JVM、.Net等虚拟机技术的发展,语言特性对高性能计算性能影响越来越低,对计算机体系结构、编译原理、虚拟机编译机制的理解,对性能的影响变得更为重要。JVM的自动优化做的非常的强悍,.net core 在这方面还有不小差距,不过 .net core 可以通过手工优化来弥补这一差距。

추천

출처www.cnblogs.com/xiaotie/p/perf-3langs.html