目录
最近在网上看到有个人做的实验,通过比较不同语言程序输出一亿次数字的时间比较不同语言的运行速度。
所以我也想试试。
考虑到我的电脑配置不高,所以我的每个语言的程序只循环输出1000000次数字。
另外,为方便统计运行时间,我给每个程序加上了统计时间的代码。
电脑运行环境
操作系统:Windows 11 , 64位
运行时的同时在运行的程序:谷歌浏览器(正在CSDN里用Markdown写文章)
所有程序都自己运行。各种语言的程序不是一起运行的。
使用编译器
Dev C++
先预览一下文件
那么就开始啦!
C
C语言使用的编译器:TDM-GCC 4.9.2 64-BIT Release
因为后来的结果,我严重怀疑这个编译器的质量不过关。
先看代码:
//C-competition.exe
#include<stdio.h>
#include<time.h>
int main(int argc,char **argv){
clock_t start=clock(); //开始时间记录
int i=0;
for(;i<1000000;i++){
printf("%d\n",i);
}
clock_t end=clock(); //结束时间记录
double spent=(double)(end-start)/CLOCKS_PER_SEC; //中间相差的时间
printf("%lfs\n",spent);
}
先对这段代码进行编译。
编译完成后,生成exe,运行。
C-competition.exe
敲下回车键,开始紧张地等待起来。。。
……
运行结果:
78.464000s!
科学老师说:为避免实验偶然性,需要多次实验取平均值。
C++
在对C语言进行了测试后,我们请来了C语言的兄弟C++,想用cout流输出来运行,然而C++不肯,非要先让我跟C语言写一样的stdio printf输出。
我们先试一下。毕竟C++兼容C语言。
//Cpp-competition1.cpp
#include<cstdio>
#include<ctime>
int main(int argc,char *argv[]){
clock_t start=clock();
for(int i=0;i<1000000;i++){
printf("%d\n",i);
}
clock_t end=clock();
double spent=(double)(end-start)/CLOCKS_PER_SEC;
printf("%lfs\n",spent);
}
还是跟C语言的程序略有区别,你发现了吗?
运行一下:
Cpp-competition1.exe
结果:
和C语言的速度差不多。
C++还支持cout这种 output stream的方式。这种方式的运行速度又怎么样呢?
//Cpp-competition2.cpp
#include<iostream>
#include<time.h>
using std::cout;
int main(int argc,char *argv[]){
clock_t start=clock();
for(int i=0;i<1000000;i++){
cout<<i<<'\n';
}
clock_t end=clock();
double spent=(double)(end-start)/CLOCKS_PER_SEC;
cout<<spent<<"s\n";
}
Cpp-competition2
这种方式就实在是慢多了。都是同一个语言,同一个编译器,所以可以得出结论:printf函数比cout更快。
按照出现的时间顺序,不到10年后,出现了Python。
Python
Python版本:Python3.13
Python不同版本之间常常有不少差异。
Python不同版本间可能有语法差异,如Python3.5引入了async/await写法,但这种东西我们的小程序用不上。重要的是运行速度差异。
我用的是: Python 3.13
Python运行结果
我为我最喜欢的语言也是入门编程的语言感到担忧,因为它毕竟是解释性语言,和编译性的C/C++的运行速度不可相比。但是Python还是勇敢地站出来尝试。
#Python-competition.py
import time
start=time.time()
for i in range(1000000):
print(i)
end=time.time()
spent=end-start
print(spent,'s')
运行
python Python-competition.py
也不知道会多慢。
……
WHAT!!!
这个结果是Python创造的吗?
现在Python这么快了吗?
是不是C/C++编译器的问题?编译出来这么慢?
还不能确定,所以请出下一位解释性语言。
Java
Java不太熟,System.curretTimeMillis函数是AI出的主意。
源码:
//JavaCompetition.java
public class JavaCompetition{
public static void main(String[] args){
long start=System.currentTimeMillis();
for(int i=0;i<1000000;i++){
System.out.println(i);
}
long end=System.currentTimeMillis();
long spent=end-start;
System.out.println(spent/1000+'s');
}
}
javac JavaCompetition.java
java JavaCompetition
我运行了好几遍都是150+s。
我发现这是程序有bug,最后加上了一个’s’。's’的ASCLL码是115,所以实际上的数据是41s。
JavaScript Node.js
在我看到的那个网友的实验中,Node.js的速度是最慢的,Python用2分钟运行完的东西,JavaScript需要超过5分钟。
在我的实验中,会不会也是这样呢?
//JavaScript-competition.js
const start=new Date().getTime()
for(let i=0;i<1000000;i++){
console.log(i)
}
const end=new Date().getTime()
const spent=end-start
console.log(spent,'s')
node JavaScript-competition.js
看一下运行结果
Go
据说比C语言略慢,但同样有很高的性能。如果这玩意儿比Python还慢,那差不多可以知道Python的性能变好了。
package main
import (
"fmt"
"time"
)
func main() {
start := time.Now()
for i := 0; i < 1000000; i++ {
fmt.Println(i)
}
end := time.Now()
spent := end.Sub(start) //这里不要写成end-start,否则会出错。Sub即subtraction。
fmt.Printf("%s\n", spent)
}
开始吧。
go run Golang-competition.go
这个几次都被杀毒软件逼停了。
这是因为Go语言是编译执行的,这条指令会在运行前在Go语言安装位置的某文件夹下生成exe,导致杀毒软件关停。
那就用下面这条:
go build Golang-competition.go
这个命令会在本目录下生成exe文件,360没有跳出来。
那就运行它吧。
Golang-competition.exe
也是和Python打了个平手。
不过话说回来,Python在其他的方面可能就没有这么快了。这个实验只是玩玩的。
隐藏了一个彩蛋
Python可以通过pyinstaller打包成exe。这个exe程序会不会运行更快呢?
试试:
pip install pyinstaller #先确保你安装了pyinstaller
pyinstaller -F Python-competition.py
打包完成后,找到dist文件夹,拖出exe
运行Python-competition.exe
。
确实更快了!比Java还快10秒!