5大开发语言同时计算素数,谁快?

Posted 愿你走出半生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5大开发语言同时计算素数,谁快?相关的知识,希望对你有一定的参考价值。

本文中的5种开发语言为:(以下排名不分先后,只是提笔写的)

  • C#
  • Python
  • C++
  • Go
  • Java

本文计算指定一个数targetNum,我们计算一下从1targetNum中的素数,并输出。

1. 本文在同一台虚拟机中运行计算

2. 各语言实现

2.1. C#语言

2.1.1. 开发环境

  1. VS2019
  2. .Net5.0

2.1.2. 代码

using System;
using System.Diagnostics;

namespace CSharpPrimeNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            PrimeNumber(100);
            PrimeNumber(200);
            PrimeNumber(500);
            PrimeNumber(1000);
            PrimeNumber(2000);
            PrimeNumber(5000);
            PrimeNumber(10000);
            PrimeNumber(50000);
            PrimeNumber(100000);
            Console.ReadKey();
        }

        private static void PrimeNumber(int targetNum)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 2; i < targetNum; i++)
            {
                int halfNum = i / 2;
                bool isPrimeNumber = true;
                for (int j = 2; j < halfNum; j++)
                {
                    if (i % j == 0)
                    {
                        isPrimeNumber = false;
                        break;
                    }
                }

                if (isPrimeNumber)
                {
                    //Console.WriteLine($"数{i}是素数...");
                }
            }
            sw.Stop();
            TimeSpan ts2 = sw.Elapsed;
            Console.WriteLine($"{targetNum}:素数计算总共花费{ts2.TotalSeconds}s.");
        }
    }
}

2.1.2. 执行结果

以下编译为Release并点击可执行程序运行

2.2 Python

2.2.1. 开发环境

  1. VSCode
  2. python 3.9.7

2.2.2. 代码

from time import *

def primeNum(targetNum):
    begin_time = time()

    for i in range(2,targetNum):
        halfNum=i/2
        isPrimeNumber = True
        j=2
        while j <= halfNum:
            if i%j==0:
                isPrimeNumber=False
                break
            j=j+1

        # if isPrimeNumber:
        #     # print(str(i)+'数是素数')
    
    end_time = time()
    run_time = end_time-begin_time
    print ('{}:素数计算总共耗时:{}s'.format(targetNum,run_time)) 

primeNum(100)
primeNum(200)
primeNum(500)
primeNum(1000)
primeNum(2000)
primeNum(5000)
primeNum(10000)
primeNum(50000)
primeNum(100000)

2.2.2. 执行结果

以下使用命令行执行

2.3. C++

2.3.1. 开发环境

  1. VS2019

2.3.2. 代码

using namespace std;


void primeNum(int targetNum)
{
    clock_t startTime = clock();
    int numCount = 0;
    for (int i = 2; i < targetNum; i++)
    {

        int halfNum = i / 2;
        bool isPrimeNumber = true;
        for (int j = 2; j <= halfNum; j++)
        {
            if (i % j == 0)
            {
                isPrimeNumber = false;
                break;
            }
        }

        if (isPrimeNumber)
        {
            numCount++;
            //cout << "数" << i << "是素数..." << endl;
        }
    }

    clock_t endTime = clock();
    cout << targetNum << ":素数计算总共花费" << endTime - startTime<<" ms ,素数个数为:"<< numCount << endl;

}

int main()
{
	primeNum(100);
	primeNum(200);
	primeNum(500);
	primeNum(1000);
	primeNum(2000);
	primeNum(5000);
	primeNum(10000);
	primeNum(50000);
    primeNum(100000);
}

2.3.3. 执行结果

2.4. Go

2.4.1. 开发环境

  1. go version go1.17.2 windows/amd64
  2. VS Code

2.4.2. 代码

package main

import(
	"fmt"
	"time"
)

func main()  {
	primeNum(100)
	primeNum(200)
	primeNum(500)
	primeNum(1000)
	primeNum(2000)
	primeNum(5000)
	primeNum(10000)
	primeNum(50000)
	primeNum(100000)
}

func primeNum(targetNum int){
	startTime := time.Now()

	var halfNum int
	var isPrimeNumber bool
	var numCount int
	halfNum=targetNum
	numCount=0
	for i := 2; i <= targetNum; i++ {
        halfNum=i/2
		isPrimeNumber = true
		for j := 2; j <= halfNum; j++ {
			if i%j ==0{
				isPrimeNumber=false
				break
			}
		}
		
        if isPrimeNumber{
			numCount=numCount+1
            // fmt.Printf("%v数是素数\\n",i)
		}
	}
	
	elapsedTime := time.Since(startTime) / time.Millisecond 
	fmt.Printf("%v:素数计算总共耗时:%d ms ,素数个数为:%v\\n",targetNum, elapsedTime,numCount)
}

2.4.3. 执行结果

2.5. Java

2.5.1. 开发环境

  1. Java8
  2. Idea

2.5.2. 代码


    public static void main(String[] args) {
        PrimeNumber(100);
        PrimeNumber(200);
        PrimeNumber(500);
        PrimeNumber(1000);
        PrimeNumber(2000);
        PrimeNumber(5000);
        PrimeNumber(10000);
        PrimeNumber(50000);
        PrimeNumber(100000);
    }

    private static void PrimeNumber(int targetNum)
    {
        long startTime=System.currentTimeMillis();   //获取开始时间

        int numCount = 0;
        for (int i = 2; i < targetNum; i++)
        {
            int halfNum = i / 2;
            boolean isPrimeNumber = true;
            for (int j = 2; j <= halfNum; j++)
            {
                if (i % j == 0)
                {
                    isPrimeNumber = false;
                    break;
                }
            }

            if (isPrimeNumber)
            {
                numCount++;
//                System.out.println(String.format("数%s是素数...",i));
            }
        }
        //函数主体代码
        long endTime=System.currentTimeMillis(); //获取结束时间
        System.out.println(String.format("%s:素数计算总共花费%s ms,素数个数为:%s",targetNum,(endTime-startTime),numCount));
    }
}

2.5.3. 执行结果

3. 效率折线

  1. C++ 最快
  2. Java和C#在这个上没有太大的区别(没有考虑预热
  3. GO表现并没有很快(没有使用协程)
  4. Python最慢

以上是关于5大开发语言同时计算素数,谁快?的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题四之计算并输出3到n之间所有素数的平方根之和

C++判断素数的代码

零基础学习Java语言——4循环控制

python计算列表中素数的个数

什么是多线程,多进程?

C语言中素数的判断方法