从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

随着时间的发展,现在的虚拟机技术越来越成熟了,在有些情况下,Java,.Net等虚拟机密集计算的性能已经和C++相仿,在个别情况下,甚至还要更加优秀。本文详细分析几个性能测试案例,探讨现象背后的原因。

来看两个简单的测试用例。如下图所示,均是循环5000次,操作 len = 1000000 的连续内存,计算执行时间。左侧为test1,右侧为test2。

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

类似的程序在 .net core 3.0 Preview6下测试。

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

测试结果对比如下:

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

我们可以看见,对于test1,C++版本要快很多,对于test2,C#版本和C++版本性能相当,甚至略快。

为什么会出现这种现象呢?下面来具体分析:

test1 的循环的赋值是位置无关的,因此,编译器可以通过SIMD等并行计算指令来优化,test2 的循环的赋值是位置相关的,编译器很难使用SIMD等并行计算指令来优化。通过上面的结果可以猜测,VC编译器,对test1进行了并行优化,而.net core 3.0 preview6 没有对test1 进行并行优化。

我们来验证这一猜测。.net core 3.0 提供了对SIMD 指令的支持,下面手动对test1进行并行优化,测试性能:

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

结果是0.633s,接近于C++版本的0.441s。相对于优化前的2.289s,提速了3倍多。

同样的程序,我用 java 8 测试,结果大吃一惊:

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

test1 耗时 0.654s,和并行优化后的.net core近似,可见 jvm 虚拟机对此进行了并行优化。test2 耗时1.755s,比C++版本和.net core版本都要快,并且差距巨大!

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

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

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

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

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

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

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

从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

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

Original: https://www.cnblogs.com/xiaotie/p/perf-3langs.html
Author: xiaotie
Title: 从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536303/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • How to: Create a C/C++ Union by Using Attributes (C#)

    【 How to: Create a C/C++ Union by Using Attributes (C#)】 1、you can create what is known as…

    C++ 2023年5月29日
    052
  • const 在 C 和 C++ 中的区别

    1 C 中的 const 内存分配 1.1 修饰全局变量 cpp;gutter:true;</p> <h1>include</h1> <p…

    C++ 2023年5月29日
    041
  • 拓扑排序(二)之 C++详解

    拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。 这样说,可能理解…

    C++ 2023年5月29日
    041
  • c++ 二进制方式读取文件 读取特殊类型数据

    1 #include 2 #include 3 using namespace std; 4 5 /* 6 二进制方式进行读写文件,可以读写 各种各样数据类型的数据 7 */ 8 …

    C++ 2023年5月29日
    068
  • Lua & C++

    Lua 与 C++ 交互 ## 提供系统级别Lua API 提供系统级别API需要对Lua源码进行修改 ### Lua源码编译 [LuaResourceCode]:https://…

    C++ 2023年5月29日
    056
  • C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Se…

    C++ 2023年5月29日
    076
  • 面向对象C++编程与实践考试题目

    一、选择题(每题2分,共2×20=40分) (1) 以下不能对数组 a 进行正确初始化的语句是( )。A. int a[2][3] = { 0 };B. int a[ ][3] =…

    C++ 2023年5月29日
    036
  • C++快速入门系列教程

    移动开发工程师 。涉及 android、ios、jni Original: https://www.cnblogs.com/xitang/p/4176128.htmlAuthor:…

    C++ 2023年5月29日
    075
  • (转载)【C++】new A和new A()的区别详解

    我们在C++程序中经常看到两种new的使用方式:new A以及new A()。那么这两种究竟有什么区别呢? 调用new分配的内存有时候会被初始化,而有时候不会,这依赖于A的类型是否…

    C++ 2023年5月29日
    044
  • C++选择文件打开方式的函数

    最近让同事给UE4一个功能,识别出 .ts、.json文件,然后双击这些文件可以直接打开。 默认双击 .json 时,调用 Windows 自带的记事本打开文件,不习惯,想着能否像…

    C++ 2023年5月29日
    058
  • (筆記) 常用設定暫存器值的編程技巧 (SOC) (C/C++) (C) (Verilog)

    Abstract設定暫存器值是寫firmware時最常見的控制,本文歸納出C語言在寫firmware時常見的編程技巧,並與Verilog相互對照。 Introduction本文將討…

    C++ 2023年5月29日
    077
  • C++11多线程

    在C++11之前,C++语言层面是不支持多线程的,想利用C++实现并发程序,借助操作系统的API实现跨平台的并发程序存在着诸多不便。在C++11中,终于提供了多线程的标准库,提供了…

    C++ 2023年5月29日
    049
  • [C++] 引用类型&

    引用的方法: 类型 &引用名 = 变量名; 例如: int a = 5; int &b = a; 引用的规则: 1、引用被创建的同时必须被初始化 2、无null引用…

    C++ 2023年5月29日
    052
  • std::get<C++11多线程库~线程间共享数据>(10):使用互斥量保护共享数据(4)

    1 #ifndef DEADLOCK_QUESTIONDESCRIBLE_AND_SOLUTION_H 2 #define DEADLOCK_QUESTIONDESCRIBLE_A…

    C++ 2023年5月29日
    051
  • 【C/C++】输出文件的相对路径

    FILE 在有些编译器上会输出带路径的文件名,删除路径可使用函数 strrchr #include #include #define __FILENAME__ (strrchr(_…

    C++ 2023年5月29日
    058
  • C++ d-bus 使用实例

    因为以后工作用的到D-bus,这两天抽空看了下c++下得d-bus的使用方法。因为网上对c++下得d-bus使用说明几乎没有,所以,在这里记录下以供同仁使用。同时感谢shengpe…

    C++ 2023年5月29日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球