C++和Java性能比较, GCC和clang性能比较

这篇博客通过实验对比了C++(GCC 8.3.1, Clang 9.0, VC++14.25)和Java(JDK11)在不同环境下的排序算法性能。测试表明,Clang编译的C++程序通常比GCC更快,而Java的速度普遍落后于C++,尤其是在涉及大量数据移动的排序算法中。Windows环境下,Java与VC++的性能差距相对较小。" 133172757,20038304,安兔兔视频测试:全方位评估音视频性能,"['音视频', '视频测试工具', '视频解码', '音频评估']

下面的图表是对1万个整数进行排序的耗时比较,C++和Java算法代码几乎完全一致,C++编译器使用了GCC,clang和VC++14.25(VS2019)。

比较的算法有:冒泡排序,鸡尾酒排序,插入排序,二分插入排序,希尔排序,快速排序。最后一个堆排序未实现,所以是0

注:C++使用的是C++11标准, Java使用的是JDK11

注:不同的表之间硬件不同,不具有可比性。

注:C++使用了std::vector存放数据,对插入排序这种需要频繁移动数据的算法影响较大,因此两种插入排序算法的C++和Java实现不具有可比性,在最后一个图中有体现。

1. Linux4.18 x86_64 (gcc8.3.1 vs clang9.0 vs JDK11.0.6)

环境:

1. 系统:CentOS8, linux 4.18, x86_64

2. C++:gcc8.3, clang 9.0

3. JDK:Oracle JDK11.0.6

可以发现:

1. clang9.0编译的程序运行速度要快于gcc8.3,

2. Java运行速度要远慢于C++(两种插入排序因为受std::vector影响,对比无效)

2. Linux4.14 aarch64 (gcc8.3.0 vs clang7.0.1 vs OpenJdk11.0.7)

C++Java代码的编译方法可分为两种情况,一是分别编译C++Java代码,二是进行C++Java的混编编译。 ### 分别编译C++Java代码 #### 编译Java代码 Java代码的编译依赖于Java开发工具包(JDK)。以一个简单的Java类 `HelloWorld.java` 为例: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` 使用 `javac` 命令来编译该Java文件: ```sh javac HelloWorld.java ``` 编译成功后,会生成一个名为 `HelloWorld.class` 的字节码文件,使用 `java` 命令运行: ```sh java HelloWorld ``` #### 编译C++代码 C++代码的编译通常使用GCCClang等编译器。以一个简单的C++程序 `hello.cpp` 为例: ```cpp #include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; } ``` 使用 `g++` 命令编译该C++文件: ```sh g++ hello.cpp -o hello ``` 编译成功后,会生成一个可执行文件 `hello`,运行该可执行文件: ```sh ./hello ``` ### C++Java混编编译 C++Java混编通常使用Java Native Interface(JNI),步骤如下: 1. 在Java程序中声明 `native` 方法(`public` 类型),并静态载入DLL库: ```java public class Test { static { System.loadLibrary("Filename"); } public native void hello(String msg); public static void main(String[] args) { Test test = new Test(); test.hello("Hello from Java!"); } } ``` 2. 编译该Java程序,并生成 `class` 文件: ```sh javac Test.java ``` 3. 利用 `javah` 编译 `class` 文件生成头文件: ```sh javah Test ``` 4. 在VC中新建工程(`win32` 工程 - `DLL`),在头文件中导入上面生成的 `.h` 文件,在附加包含路径里面设置Java JDK的 `include` 路径。 5. 在相应的 `cpp` 文件中实现函数: ```cpp #include <jni.h> #include <windows.h> #include "Test.h" JNIEXPORT void JNICALL Java_Test_hello(JNIEnv * env, jobject obj, jstring jMsg) { const char *strMsgPtr = env->GetStringUTFChars(jMsg, 0); MessageBox(0, strMsgPtr, "Message box from VC++ ", 0); env->ReleaseStringUTFChars(jMsg, strMsgPtr); } ``` 6. 编译生成DLL文件,然后拷贝到Java类文件目录下,再次编译Java程序即可。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值