使用斐波那契(Fibonacci)数列来测试各大语言的性能

笔者使用最多的语言是C++,目前项目中在使用Go,也使用过不少其它语言,像Erlang,Python,Lua,C#等等。最近看到C#夺冠,首次荣获 TIOBE 年度编程语言,同时也看到网上有不少Java与C#之争的文章,于是就想要来做一个性能比较。

这里参与性能比较的是以下几门语言:Go、C#、Java、Python、Erlang。这些语言或语言标准库本身都提供了大数计算的支持,不需要自己实现大数计算或者找额外的库来实现大数计算。

笔者选取计算斐波那契(Fibonacci)数列来做性能比较,可能会有局限性,仅作参考。斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89……这个数列从第3项开始 ,每一项都等于前两项之和。为了达到一定计算量,但又不会费时太久,笔者以计算100万次斐波那契(Fibonacci)数列的耗时来作为依据。

一、测试环境

项目参数
CPU11th Gen Intel® Core™ i7-11700 @ 2.50GHz
内存32G
硬盘WD NVMe SSD
操作系统Windows 10 22H2

二、各语言源码

1、Go源码

GO版本为1.12.5

package mainimport ("fmt""math/big"
)func main() {a := big.NewInt(1)b := big.NewInt(1)sum := big.NewInt(0)for i := 0; i < 1000000; i++ {sum = sum.Add(a, b)b.Set(a)a.Set(sum)}fmt.Println(sum)
}

2、C#源码

C#选择的是.net 8.0.101

using System.Numerics;BigInteger a = new BigInteger(1);
BigInteger b = new BigInteger(1);
BigInteger sum = new BigInteger(0);
for (int i = 0; i < 1000000; i++)
{sum = a + b;b = a;a = sum;
}Console.WriteLine(sum);

3、Java源码

Java版本是21.0.1

import java.math.BigInteger;public class t {public static void main(String[] args) {BigInteger a = BigInteger.valueOf(1);BigInteger b = BigInteger.valueOf(1);for (int i = 0; i < 1000000; i++) {BigInteger sum = a.add(b);b = a;a = sum;}System.out.println(a.toString());}
}

4、Python源码

import syssys.set_int_max_str_digits(1000000)
a = 1
b = 1
sum = 0
for i in range(0, 1000000):sum = a + bb = aa = sumprint(sum)

5、Erlang(暂缺)

二、使用VSCode Code Runner测试

由于有些语言有缓存,所以都以多次执行结果较少耗时的为准:

1. Go

在这里插入图片描述

2. C#

dotnet run

在这里插入图片描述

3. Java

javac t.java && java t

在这里插入图片描述

4. Python

set PYTHONIOENCODING=utf-8 && python.exe -u main.y

在这里插入图片描述

5. Erlang(暂缺)

三、使用命令行测试

1. go

time go run main.go

在这里插入图片描述
使用go build main.go编译成exe后再运行time ./main

在这里插入图片描述

2. C#

time dotnet run
在这里插入图片描述

直接执行生成的exe:

在这里插入图片描述

3. Java

time java t

在这里插入图片描述

4. Python

time python main.py

在这里插入图片描述

四、结果统计

语言Code Runner结果命令行编译运行结果命令行exe运行结果
Go3.548秒3.539秒3.068秒
C#10.295秒10.075秒9.255秒
Java10.654秒9.814秒/
Python5.939秒5.943秒/
Erlang

从结果可以看出,Go作为后起的名门之秀,在此项测试中是遥遥领先;C#在没有使用.net 8的AOT特性的情况下,依旧是略胜Java一筹,相信如果使用了AOT,可能会更快,但是其编译速度相比JAVA有点拖后腿;让人大跌眼镜的是Python,在传统认识中Python是应该比C#和JAVA慢的,但是出人意料的是比他们俩都快不少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习300问】4、机器学习到底在学习什么?

首先我们先了解一个前置问题&#xff0c;再回答机器学习到底在学习什么。 一、求机器学习问题有哪几步&#xff1f; 求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段。首先&#xff0c;在学习阶段进行模型的学习&#xff0c;然后&#xff0c;在推理阶段用学到的模型…

C++ STL中的 pair

pair 概述 pair 用于将两个可能是不同数据类型的值结合在一起。pair 提供了一种将两个异构对象存储为单个单元的方法。如果想存储元组&#xff0c;基本上会使用它。pair 容器是一个定义在 <utility> 头文件中的简单容器&#xff0c;由两个数据元素或对象组成。 第一个元…

匠心科技BLDC开发板原理图讲解

匠心科技BLDC开发板资料 链接&#xff1a;https://pan.baidu.com/s/1s5YjzRSDLKQvl86lBVAqKA?pwda6cx 提取码&#xff1a;a6cx 解压密码&#xff1a;JXKJ_RALDNWB站视频讲解&#xff08;&#xff09; 链接: 匠心科技直流无刷电机开发板原理图讲解 BLDC的开发板主要分为四个模…

【PythonCode】eval()函数巩固和复数模运算等

【PythonCode】eval()函数巩固和复数模运算等 前言 在很多高大上的项目中&#xff0c;一个花费很长时间、消耗大量人力物力才查出来的BUG&#xff0c;经常是一个符号错误、一个值传错、一个基本函数的用法没有考虑周到等基本问题&#xff0c;所以基础不牢、地动山摇&#xff0…

Linux的权限(1)

目录 操作系统的"外壳"程序 外壳程序是什么&#xff1f; 为什么存在外壳程序&#xff1f; 外壳程序怎么运行操作&#xff1f; 权限 什么是权限&#xff1f; 权限的本质&#xff1f; Linux中的&#xff08;人&#xff09;用户权限&#xff1f; su和su -的区别…

2024 1.6~1.12 周报

一、上周工作 论文研读 二、本周计划 思考毕业论文要用到的方法或者思想&#xff0c;多查多看积累可取之处。学习ppt和上周组会内容、卷积神经网络。 三、完成情况 1. 数据训练的方式 1.1 迁移学习 迁移学习是一种机器学习方法&#xff0c;把任务 A 训练出的模型作为初始模…

react 项目结构配置

1 项目整体目录结构的搭建 如下图&#xff1a; 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入&#xff1a;import ‘noremalize.css’ 第二步 创建自己的css样式&#xff1a;在assets文件夹中创建css…

常用冷凝器的传热系数与单位换热面积推荐数据

制冷剂 氨 立式壳管式 700~800 传热系数W/m2℃ 3000~4000 单位面积热负荷W/m2 &#xff08;1&#xff09;温升2~3℃ &#xff08;2&#xff09;传热温差4~6℃ &#xff08;3&#xff09;单位面积冷水耗量1~1.7m3/m2h &#xff08;4&#xff09;光钢管 &#xff08;5&#xf…

【设计模式-03】Strategy策略模式及应用场景

一、简要描述 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

JAVA进化史: JDK14特性及说明

JDK 14于2020年3月发布。这个版本引入了一些新特性和改进&#xff0c;以下是其中一些主要特性 JEP 361: 进一步改进了switch表达式 进一步改进了switch表达式&#xff0c;引入了新的用法和语法。 // 使用标准的switch表达式 int day 3; String dayType switch (day) {case…

js(JavaScript)数据结构之散列表(Hash)

什么是数据结构&#xff1f; 下面是维基百科的解释&#xff1a; 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装&#xff1a;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

web学习笔记(十五)

目录 1.Date对象 1.1日期对象的概念 1.2Date()方法的使用 1.3Date()常用方法汇总 1.4例题&#xff1a;用函数编写一个倒计时 2.函数 2.1函数的概念 2.2函数的使用 2.3函数的参数 2.4函数的声明 2.5函数的返回值 2.6异步函数 3特殊函数类型 3.1匿名函数 3.2箭头函数…

前端开发中需要注意的CSS命名规则以及书写顺序

1、CSS的命名——BEM规则&#xff1a; CSS命名一般是用 BEM 规则命名的。它背后的想法是将用户界面划分为独立的块。 BEM的意思就是B模块(block)、E元素(element)、M修饰符(modifier)&#xff0c; 即&#xff1a;[block]__[element]--[modifier]。 模块和子元素之间用两个下划…

SPARK--cache(缓存)和checkpoint检查点机制

SPARK–cache(缓存)和checkpoint检查点机制 rdd的特性 缓存和checkpoint 作用都是进行容错rdd在计算是会有多个依赖&#xff0c;为了避免计算错误是从头开始计算&#xff0c;可以将中间* 依赖rdd进行缓存或checkpoint缓存或checkpoint也叫作rdd的持久化一般对某个计算特别复杂的…

[Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明

类创建&#xff1a;abstract&#xff08;抽象类&#xff09;、extension&#xff08;扩展&#xff09; 1.abstract&#xff08;抽象类&#xff09; dart 抽象类主要用于定义标准&#xff0c;子类可以继承抽象类&#xff0c;也可以实现抽象类接口。抽象类通过abstract 关键字来…

一端进,两端出(队列)C++

*给定一个输入受限的双端队列&#xff08;即一个端点允许插入和删除&#xff0c;另一个端点只允许删除的双端队列&#xff09;和一个长度为 N 的插入序列。插入序列中的元素两两不同。你需要将插入序列中的元素按顺序依次插入到给定队列中。 在插入过程中和插入完成后的任意时…

【软件测试】学习笔记-静态测试方法

这篇文章详细讨论人工静态测试方法和自动静态测试方法&#xff0c;来帮你理解研发流程上是如何保证代码质量的&#xff0c;以及如何搭建自己的自动静态代码扫描方案&#xff0c;并且应用到项目的日常开发工作中去。 人工静态方法本质上属于流程上的实践&#xff0c;实际能够发…

QEMU源码全解析 —— PCI设备模拟(7)

接前一篇文章&#xff1a; 上一回讲解了pci_edu_realize函数中的pci_register_bar函数&#xff0c;本回开始对于edu设备的MMIO读写函数进行解析。 操作系统与PCI设备交互的主要方式是PIO和MMIO。MMIO虽然是一段内存&#xff0c;但是其没有EPT映射&#xff0c;在虚拟机访问设备…

Smallpdf扫描、转换、压缩、编辑、签名PDF

【应用名称】&#xff1a;Smallpdf: 扫描、转换、压缩、编辑、签名PDF 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Smallpdf 【应用版本】&#xff1a;1.71.0 【应用大小】&#xff1a;150MB 【软件说明】&#xff1a;通过 Smallpdf&#xff0c;您可以&…

数据结构 模拟实现二叉树(孩子表示法)

目录 一、二叉树的简单概念 &#xff08;1&#xff09;关于树的一些概念 &#xff08;2&#xff09;二叉树的一些概念及性质 定义二叉树的代码&#xff1a; 二、二叉树的方法实现 &#xff08;1&#xff09;createTree &#xff08;2&#xff09;preOrder &#xff08;…