当前位置:   article > 正文

net8 golang python性能比较_net8性能评测

net8性能评测

net8正式版出来两个月,现在性能到底如何呢,做个简单的例子和其他语言比较一下,测试内容是查找1000000以内的质数,代码不多,但包含了循环计算和Math库函数调用,直观的看一下语言之间差距是多少,心里有个底,测试机是笔记本surface book 2 intel i7 有个四五年了,不过还能跑

单线程篇

首先来看看google的王牌语言golang,语法简单但性能号称不输C++,先看一下go 1.20.2

  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. "time"
  6. )
  7. func isPrime(num int) bool {
  8. if num <= 1 {
  9. return false
  10. }
  11. for i := 2; i <= int(math.Sqrt(float64(num))); i++ {
  12. if num%i == 0 {
  13. return false
  14. }
  15. }
  16. return true
  17. }
  18. func countPrimes(n int) int {
  19. count := 0
  20. for i := 2; i < n; i++ {
  21. if isPrime(i) {
  22. count++
  23. }
  24. }
  25. return count
  26. }
  27. func main() {
  28. num := 1000000
  29. startTime := time.Now()
  30. result := countPrimes(num)
  31. endTime := time.Now()
  32. fmt.Printf("The number of prime numbers less than %d is: %d\n", num, result)
  33. fmt.Printf("Execution time: %v\n", endTime.Sub(startTime))
  34. }

编译之后看看耗时是多少

然后看看net6

  1. using System;
  2. using System.Diagnostics;
  3. namespace FindPrimeNet6
  4. {
  5. class Program
  6. {
  7. static bool IsPrime(int num)
  8. {
  9. if (num <= 1)
  10. {
  11. return false;
  12. }
  13. for (int i = 2; i <= Math.Sqrt(num); i++)
  14. {
  15. if (num % i == 0)
  16. {
  17. return false;
  18. }
  19. }
  20. return true;
  21. }
  22. static int CountPrimes(int n)
  23. {
  24. int count = 0;
  25. for (int i = 2; i < n; i++)
  26. {
  27. if (IsPrime(i))
  28. {
  29. count++;
  30. }
  31. }
  32. return count;
  33. }
  34. static void Main(string[] args)
  35. {
  36. int num = 1000000;
  37. Stopwatch timer = Stopwatch.StartNew();
  38. int result = CountPrimes(num);
  39. timer.Stop();
  40. Console.WriteLine($"The number of prime numbers less than {num} is: {result}");
  41. Console.WriteLine($"Execution time: {timer.ElapsedMilliseconds:F4} ms");
  42. }
  43. }
  44. }

运行一下看看

然后重头来了net8 开启aot怎么样呢

看来速度没提升,应该是启动速度提高了

然后我们再看看大家心目中最慢的python,装了3.11.7版本

  1. #import numba
  2. import math
  3. import time
  4. #@numba.jit
  5. def is_prime(num):
  6. if num <= 1:
  7. return False
  8. for i in range(2, int(math.sqrt(num)) + 1):
  9. if num % i == 0:
  10. return False
  11. return True
  12. #@numba.jit
  13. def count_primes(n):
  14. count = 0
  15. for i in range(2, n):
  16. if is_prime(i):
  17. count += 1
  18. return count
  19. num = 1000000
  20. start_time = time.perf_counter()
  21. result = count_primes(num)
  22. end_time = time.perf_counter()
  23. time_elapsed = end_time - start_time
  24. print(f"The number of prime numbers less than {num} is: {result}")
  25. print(f"Execution time: {time_elapsed*1000:.4f}ms")

看看普通模式跑跑要多少毫秒

竟然3秒7 是golang10倍,然后让我们开了jit再跑一次

看起来 并没有差前两个语言很多

然后打包exe再执行一次 差强人意哈哈 单线程性能就这样了,参考一下 。

并行计算篇

测试完上面的,各个语言粉丝说不服,根本没有发挥出优势,结果并不能说明真正的快慢,那我又重新写了一下这三个语言的并行计算方法,比较这种情况到底谁快,结果可能你想不到。

首先还是golang 这次采用routine协程方式计算代码贴上

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. func isPrime(num int) bool {
  8. if num <= 1 {
  9. return false
  10. }
  11. for i := 2; i*i <= num; i++ {
  12. if num%i == 0 {
  13. return false
  14. }
  15. }
  16. return true
  17. }
  18. func countPrimes(start, end int, resultChan chan int, wg *sync.WaitGroup) {
  19. defer wg.Done()
  20. count := 0
  21. for i := start; i < end; i++ {
  22. if isPrime(i) {
  23. count++
  24. }
  25. }
  26. resultChan <- count
  27. }
  28. func main() {
  29. startTime := time.Now()
  30. num := 1000000
  31. goroutines := 10
  32. results := make(chan int, goroutines)
  33. var wg sync.WaitGroup
  34. wg.Add(goroutines)
  35. step := num / goroutines
  36. for i := 0; i < goroutines; i++ {
  37. start := i * step
  38. end := (i + 1) * step
  39. if i == goroutines-1 {
  40. end = num
  41. }
  42. go countPrimes(start, end, results, &wg)
  43. }
  44. wg.Wait()
  45. close(results)
  46. total := 0
  47. for result := range results {
  48. total += result
  49. }
  50. endTime := time.Now()
  51. fmt.Printf("Total number of primes: %d\n", total)
  52. fmt.Printf("Execution time: %v\n", endTime.Sub(startTime))
  53. }

编译运行一下试试

golang 一下就赶上来了,成绩不错恭喜恭喜,速度还可以就是写法会麻烦了一些

看看net8 代码先上来,记得要编译release版本

  1. using System;
  2. using System.Diagnostics;
  3. namespace FindPrime
  4. {
  5. class Program
  6. {
  7. static int CountPrimes()
  8. {
  9. const int maxNumber = 1000000;
  10. int primeCount = 0;
  11. bool[] isPrime = new bool[maxNumber + 1];
  12. for (int i = 2; i <= maxNumber; i++)
  13. {
  14. isPrime[i] = true;
  15. }
  16. Parallel.For(2 , maxNumber + 1, i =>
  17. {
  18. for (int j = 2; j <= Math.Sqrt(i); j++)
  19. {
  20. if (i % j == 0)
  21. {
  22. isPrime[i] = false;
  23. break;
  24. }
  25. }
  26. });
  27. for (int i = 2; i <= maxNumber; i++)
  28. {
  29. if (isPrime[i])
  30. {
  31. primeCount++;
  32. }
  33. }
  34. return primeCount;
  35. }
  36. static void Main(string[] args)
  37. {
  38. Stopwatch timer = Stopwatch.StartNew();
  39. int result = CountPrimes();
  40. timer.Stop();
  41. Console.WriteLine($"The number of prime numbers is: {result}");
  42. Console.WriteLine($"Execution time: {timer.ElapsedMilliseconds:F4} ms");
  43. }
  44. }
  45. }

跑起来看看,貌似负优化,其实之前在amd ryzen cpu上并行是比单线程快的,这个优化的不稳定

最后上boss,我们的python大佬要登场了,看看科学界的宠儿到底怎么样

  1. import numpy as np
  2. import time
  3. start_time = time.perf_counter()
  4. # 创建包含所有整数的数组
  5. numbers = np.arange(2, 1000000)
  6. # 创建布尔数组,初始化为 True
  7. is_prime = np.ones(len(numbers), dtype=bool)
  8. # 筛选法标记非质数
  9. for i in range(2, int(np.sqrt(1000000)) + 1):
  10. if is_prime[i - 2]:
  11. is_prime[i * 2 - 2::i] = False
  12. # 获取所有质数
  13. primes = numbers[is_prime]
  14. # 打印质数
  15. end_time = time.perf_counter()
  16. time_elapsed = end_time - start_time
  17. print(f"The number of prime numbers is: {len(primes)}")
  18. print(f"Execution time: {time_elapsed*1000:.4f}ms")

不编译exe了直接脚本跑,结果出来了,快golang10倍,所以说数值计算还是来python吧,没啥说的 散会

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/136469
推荐阅读
相关标签
  

闽ICP备14008679号