本篇内容介绍了“C#、Java和Python性能比较分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

实验

这里使用三种语言进行矩阵乘法。 矩阵的大小为2048 x 2048(即每个矩阵的乘法和加法运算为8,589,934,592),我为它们填充了0.0到1.0之间的随机值(使用随机值而不是对所有三种语言使用完全相同的矩阵的影响可以忽略不计)。每个实验运行了五次,并计算了平均运行时间。

1.C代码

#include<stdlib.h>#include<stdio.h>#include<time.h>#definen2048doubleA[n][n];doubleB[n][n];doubleC[n][n];intmain(){//populatethematriceswithrandomvaluesbetween0.0and1.0for(inti=0;i<n;i++){for(intj=0;j<n;j++){A[i][j]=(double)rand()/(double)RAND_MAX;B[i][j]=(double)rand()/(double)RAND_MAX;C[i][j]=0;}}structtimespecstart,end;doubletime_spent;//matrixmultiplicationclock_gettime(CLOCK_REALTIME,&start);for(inti=0;i<n;i++){for(intj=0;j<n;j++){for(intk=0;k<n;k++){C[i][j]+=A[i][k]*B[k][j];}}}clock_gettime(CLOCK_REALTIME,&end);time_spent=(end.tv_sec-start.tv_sec)+(end.tv_nsec-start.tv_nsec)/1000000000.0;printf("Elapsedtimeinseconds:%f\n",time_spent);return0;}

2.Java代码

importjava.util.Random;publicclassMatrixMultiplication{staticintn=2048;staticdouble[][]A=newdouble[n][n];staticdouble[][]B=newdouble[n][n];staticdouble[][]C=newdouble[n][n];publicstaticvoidmain(String[]args){//populatethematriceswithrandomvaluesbetween0.0and1.0Randomr=newRandom();for(inti=0;i<n;i++){for(intj=0;j<n;j++){A[i][j]=r.nextDouble();B[i][j]=r.nextDouble();C[i][j]=0;}}longstart=System.nanoTime();//matrixmultiplicationfor(inti=0;i<n;i++){for(intj=0;j<n;j++){for(intk=0;k<n;k++){C[i][j]+=A[i][k]*B[k][j];}}}longstop=System.nanoTime();doubletimeDiff=(stop-start)*1e-9;System.out.println("Elapsedtimeinseconds:"+timeDiff);}}

3.python代码

importrandomimporttimen=2048#populatethematriceswithrandomvaluesbetween0.0and1.0A=[[random.random()forrowinrange(n)]forcolinrange(n)]B=[[random.random()forrowinrange(n)]forcolinrange(n)]C=[[0forrowinrange(n)]forcolinrange(n)]start=time.time()#matrixmultiplicationforiinrange(n):forjinrange(n):forkinrange(n):C[i][j]+=A[i][k]*B[k][j]end=time.time()print("Elapsedtimeinseconds%0.6f"%(end-start))如何编译与运行

#CgccMatrixMultiplication.c-omatrix./matrix#JavajavacMatrixMultiplication.javajavaMatrixMultiplication#PythonpythonMatrixMultiplication.py运行时间

根据这些结果,CJava慢2.34倍,PythonJava慢33.34倍。

等待!!! C不是应该最快的吗???

实际上,这是不公平的比较。 当我们编译Java程序时,即使没有任何优化标志,Java JIT(即时)编译器也会自动执行优化。 但是,对于GCC(编译C程序),情况并非如此,我们必须显式设置优化标志。

因此,在编译C程序时使用了-O2-O3优化标志,并再次进行了实验。

新的运行时间

现在,Java代码比C[-O3]慢1.69倍,而Python代码慢56倍。 我做出了正确的决定(或者很幸运:-)),选择了C而不是其他编程语言。

讨论结果

Python相对非常慢,因为C是经过编译的,而Python是被解释的。 编译器一次将C代码转换为机器代码。 另一方面,解释器必须读取,解释和执行每一行代码,并更新机器状态(这会增加很多开销)。 将程序编译为机器代码时,CPU可以直接执行它。 但是,当涉及到解释器时,CPU将运行解释器,并且解释器本身将执行程序。 (如果您对编译器和解释器感兴趣,请阅读Vaidehi Joshi撰写的精彩文章)

这就是使Python非常灵活的原因。 Python牺牲了一点性能来提供更多的灵活性/高级编程功能(如果不使用C语言指定数据类型,则不能将变量初始化为n = 100,但是可以在Python中进行初始化)。

JIT(Java编译器)位于CPython之间。 首次执行代码时,将对其进行解释。 但是,当一段代码频繁执行时,它会实时编译为机器代码,并且进一步的执行将使用编译后的版本。

“C#、Java和Python性能比较分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!