C++,Java,Python 三种语言执行速度的测试与简要分析

今天我分别使用C++,Java,Python 3种程序设计语言编写了一个遍历1~1e8(1亿)之间所有整数并求和的代码,目的是定量测试这3种语言的代码效率。

测试代码01:(C++)

#include<bits/stdc++.h>
#include<sysinfoapi.h>
#define ll long long
using namespace std;
int main(int argc,char **argv)
{
    printf("C++\n");
    FILETIME start,end;
    ll during;
    int q=100000000;ll i=0;
    GetSystemTimeAsFileTime(&start);
    while (q--)
    {
        i+=q;
    }
    GetSystemTimeAsFileTime(&end);
    during=100*(end.dwLowDateTime-start.dwLowDateTime);
    printf("Result: %lld\n",i);
    printf("Time: %lf seconds.\n",during/1000.0/1000000.0);
    return 0;
}

测试代码02:(Java)

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Java:");
        int q=100000000;
        long i=0;
        long start=System.nanoTime();long end;
        for(int y=0;y<q;++y)
        {
            i+=y;
        }
        end=System.nanoTime();
        System.out.println("Result: "+i);
        System.out.println("Time: "+(end-start)/100000000.0+" seconds.");
    }
}

测试代码03:(Python)

# Test.py
import time
import numpy as np
print("Common Python:")
start=time.time()
num=0
for i in range(100000000):
    num+=i
end=time.time()
print("Result: ",num)
print("Time: "+str(round(end-start,6))+" seconds.")

print("\nNumpy:")
start=time.time()
d=np.arange(100000000)
num=np.sum(d,dtype=np.int64)
end=time.time()
print("Result: ",num)
print("Time: "+str(round(end-start,6))+" seconds.")

测试结果:


从运行时间来看,C++速度是快的,但是Java的速度并没有我们想象的那么慢。究其原因,很可能是,我使用的目前最新的Java17版本,JVM一方面已经经过了多次优化,效率可以与C语言相媲美,另一方面,JVM在执行期间,如果它发现某块代码或者方法执行地特别频繁,就会将这一部分代码标记为热点代码。一旦被标记为热点代码,那么JIT(Just in time Compiler,即时编译器)就会对此部分代码进行深度优化,而后输出一份编译后的机器码(质量很高,执行效率非常高),当这个热点代码再次执行时,就会直接采用已经编译好的机器码,而不是由解释器一句一句地翻译,从而提升了执行速度。

Python借鉴了Java的这一思想,Python解释器也有“即时编译”的机制,但从结果上看,Python的速度比Java慢了20倍左右,主要原因是python是动态变量类型的语言,程序运行时需要随时检查变量类型;而且Python使用了GIL(全局解释器锁),当初设计者加入这一“锁”是为了规避并发带来的一系列问题,诸如死锁和线程不安全等,虽然解决了线程的问题,但更大的问题接踵而来:不论是单核CPU还是多核CPU,也不管你在代码中建立并运行了几个子线程,实际中它只按单线程运行。这两大原因是拖累Python速度的关键。而第三方库Numpy,是专门用于处理数据和科学计算的,不仅已高度优化,而且它的底层调用了编译好了的C语言级别的pyc等,速度非常快,在上面的测试中,它的速度竟超过了C++,可以说是避开了Python的两个缺点。


关于解释型语言的即时编译机制,我再多说一句,对于循环次数很多的嵌套循环语句,即时编译的优势更加明显,甚至有时效率能超过静态的机器码,请看下图:

C++代码:

Java代码:

执行结果:

嵌套循环,用Java只需2.6秒,而C++用了19.5秒,两者相差近7.5倍。 


本文结束,感谢您的阅览。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Duyu09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值