C,Java和Python三门编程语⾔性能⽐较
在编程中有许多语⾔,⽽不同的编程语⾔有时候也能实现相同的功能,那么不同语⾔之间的运⾏速度有多少差别呢?这⾥选择  ,  和三门热门语⾔来做⽐较。
实验
这⾥使⽤三种语⾔进⾏矩阵乘法。矩阵的⼤⼩为2048 x 2048(即每个矩阵的乘法和加法运算为8,589,934,592),我为它们填充了0.0到1.0之间的随机值(使⽤随机值⽽不是对所有三种语⾔使⽤完全相同的矩阵的影响可以忽略不计)。每个实验运⾏了五次,并计算了平均运⾏时间。
1.C代码
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4
5#define n 2048
6
7double A[n][n];
8double B[n][n];
9double C[n][n];
10
11int main() {
12
13//populate the matrices with random values between 0.0 and 1.0
14for (int i = 0; i < n; i++) {
15for (int j = 0; j < n; j++) {
16
17            A[i][j] = (double) rand() / (double) RAND_MAX;
18            B[i][j] = (double) rand() / (double) RAND_MAX;
19            C[i][j] = 0;
20        }
21    }
22
23struct timespec start, end;
24double time_spent;
25
26//matrix multiplication
27    clock_gettime(CLOCK_REALTIME, &start);
28for (int i = 0; i < n; i++) {
29for (int j = 0; j < n; j++) {
30for (int k = 0; k < n; k++) {
31                C[i][j] += A[i][k] * B[k][j];
32            }
33        }
34    }
35    clock_gettime(CLOCK_REALTIME, &end);
36    time_spent = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / 1000000000.0;
37    printf("Elapsed time in seconds: %f \n", time_spent);
38return0;
39 }
2.Java代码
1import java.util.Random;
2
3public class MatrixMultiplication {
4static int n = 2048;
5static double[][] A = new double[n][n];
6static double[][] B = new double[n][n];
7static double[][] C = new double[n][n];
8
9public static void main(String[] args) {
10//populate the matrices with random values between 0.0 and 1.0
11        Random r = new Random();
12for (int i = 0; i < n; i++) {
13for (int j = 0; j < n; j++) {
14                A[i][j] = r.nextDouble();
15                B[i][j] = r.nextDouble();
16                C[i][j] = 0;
17            }
18        }
19
20long start = System.nanoTime();
21//matrix multiplication
22for (int i = 0; i < n; i++) {
23for (int j = 0; j < n; j++) {
24for (int k = 0; k < n; k++) {
25                    C[i][j] += A[i][k] * B[k][j];
26                }
27            }
28        }
29
30long stop = System.nanoTime();
31double timeDiff = (stop - start) * 1e-9;
32        System.out.println("Elapsed time in seconds: " + timeDiff);
33    }
34 }
3.python代码
1import random
2import time
3
4 n = 2048
5
6#populate the matrices with random values between 0.0 and 1.0
7 A = [[random.random() for row in range(n)] for col in range(n)]
8 B = [[random.random() for row in range(n)] for col in range(n)]
9 C = [[0 for row in range(n)] for col in range(n)]
10
11 start = time.time()
12#matrix multiplication
13for i in range(n):
14for j in range(n):
15for k in range(n):
16            C[i][j] += A[i][k] * B[k][j]
17
18 end = time.time()
19print("Elapsed time in seconds %0.6f" % (end-start))
如何编译与运⾏
#C
gcc MatrixMultiplication.c -o matrix
./matrix
#Java
javac MatrixMultiplication.java
java MatrixMultiplication
#Python
python MatrixMultiplication.py
运⾏时间
根据这些结果,C⽐Java慢2.34倍,Python⽐Java慢33.34倍。
等待 C不是应该最快的吗
实际上,这是不公平的⽐较。当我们编译Java程序时,即使没有任何优化标志,Java JIT(即时)编译器也会⾃动执⾏优化。但是,对
于GCC(编译C程序),情况并⾮如此,我们必须显式设置优化标志。
因此,在编译C程序时使⽤了-O2和-O3优化标志,并再次进⾏了实验。
gcc -O2 MatrixMultiplication.c -o matrix./matrixgcc -O3 MatrixMultiplication.c -o matrix./matrix
新的运⾏时间python转java代码
现在,Java代码⽐C[-O3]慢1.69倍,⽽Python代码慢56倍。我做出了正确的决定(或者很幸运:-)),选择了C⽽不是其他编程语⾔。
总结结果
讨论结果
Python相对⾮常慢,因为C是经过编译的,⽽Python是被解释的。编译器⼀次将C代码转换为机器代码。另⼀⽅⾯,解释器必须读取,解释和执⾏每⼀⾏代码,并更新机器状态(这会增加很多开销)。将程序编译为机器代码时,CPU可以直接执⾏它。但是,当涉及到解释器时,CPU将运⾏解释器,并且解释器本⾝将执⾏程序。(如果您对编译器和解释器感兴趣,请阅读Vaidehi Joshi撰写的精彩⽂章)
这就是使Python⾮常灵活的原因。 Python牺牲了⼀点性能来提供更多的灵活性/⾼级编程功能(如果不使⽤C语⾔指定数据类型,则不能将变量初始化为n = 100,但是可以在Python中进⾏初始化)。
JIT(Java编译器)位于C和Python之间。⾸次执⾏代码时,将对其进⾏解释。但是,当⼀段代码频繁执⾏时,它会实时编译为机器代码,并且进⼀步的执⾏将使⽤编译后的版本。
以上就是关于三门编程语⾔的⽐较结论。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。