找回密码
 立即注册
查看: 5563|回复: 44

[软件] 桌面平台CPU性能测试(单核)裸机程序:Rust计算圆周率500位

[复制链接]
     
发表于 2024-12-11 11:42 | 显示全部楼层 |阅读模式
本帖最后由 Xerxes_2 于 2024-12-15 14:52 编辑

代码逻辑严格参照之前的 JS 版
纯控制台程序,要做手机 App 的话比较麻烦,先写个桌面平台的,暂时编了 x86 Win 和 arm macOS,其他平台可以自己编,不难
另外由于测试时间短,方差大,可以多跑几次取最小值 更新跑 100 次取平均,print写错了 50 次不影响
  1. use bigdecimal::{BigDecimal, Context, One};
  2. use std::{borrow::Cow, num::NonZero};
  3. fn main() {
  4.     println!("开始计算, 50次……");
  5.     let mut res = Vec::with_capacity(50);
  6.     const BIT: usize = 500;
  7.     for _ in 0..100 {
  8.         let start = std::time::Instant::now();
  9.         let cx = Context::new(
  10.             NonZero::new(1006).unwrap(),
  11.             bigdecimal::RoundingMode::HalfEven,
  12.         );
  13.         let mut polygon = BigDecimal::from(6);
  14.         let r = BigDecimal::one();
  15.         let mut big_m = Cow::Borrowed(&r);

  16.         loop {
  17.             let big_g = (&r.square() - (big_m.as_ref() / 2u8).square())
  18.                 .sqrt_with_context(&cx)
  19.                 .unwrap();
  20.             let j = &r - big_g;
  21.             let m = ((big_m.as_ref() / 2u8).square() + j.square())
  22.                 .sqrt_with_context(&cx)
  23.                 .unwrap();
  24.             polygon = polygon * 2u8;
  25.             let perimeter = &polygon * &m;
  26.             let pi = &perimeter / 2u8;
  27.             big_m = Cow::Owned(m);
  28.             let pi_string = pi.to_string();
  29.             const PI: &str = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989";
  30.             if pi_string[0..BIT + 2] == PI[0..BIT + 2] {
  31.                 res.push(start.elapsed());
  32.                 break;
  33.             }
  34.         }
  35.     }
  36.     let sum = res.iter().sum::<std::time::Duration>();
  37.     let min = res.iter().min().unwrap();
  38.     let max = res.iter().max().unwrap();
  39.     let avg = sum / res.len() as u32;
  40.     println!("平均耗时: {:?}", avg);
  41.     println!("最短耗时: {:?}", min);
  42.     println!("最长耗时: {:?}", max);
  43.     let variance = res
  44.         .iter()
  45.         .map(|x| {
  46.             let x = x.as_secs_f64() * 1_000.0;
  47.             (x - avg.as_secs_f64() * 1_000.0).powi(2)
  48.         })
  49.         .sum::<f64>()
  50.         / res.len() as f64;
  51.     println!("标准差: {}ms", variance.sqrt());
  52.     println!("按Enter退出……");
  53.     let _ = std::io::stdin().read_line(&mut String::new());
  54. }
复制代码



再更新一个用 gmp 的,这个应该就是目前算法的极限了

  1. use rug::{
  2.     Float, Integer,
  3.     float::Round,
  4.     ops::{AddAssignRound, DivAssignRound},
  5. };
  6. fn main() {
  7.     println!("开始计算, 100次……");
  8.     let mut res = Vec::with_capacity(100);
  9.     const BIT: usize = 500;
  10.     for _ in 0..100 {
  11.         let start = std::time::Instant::now();
  12.         let mut polygon = Integer::from(6);
  13.         const R: &Integer = Integer::ONE;
  14.         let mut big_m = Float::with_val(1669, 1);

  15.         loop {
  16.             big_m.square_mut();
  17.             big_m.div_assign_round(4, Round::Nearest);
  18.             let big_g = (R - big_m.to_owned()).sqrt();
  19.             let j = R - big_g;
  20.             big_m.add_assign_round(j.square(), Round::Nearest);
  21.             big_m.sqrt_mut();
  22.             polygon *= 2;
  23.             let perimeter = big_m.to_owned() * &polygon;
  24.             let mut pi = perimeter;
  25.             pi.div_assign_round(2, Round::Nearest);
  26.             let pi_string = pi.to_string();
  27.             const PI: &str = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989";
  28.             if let Some(slice) = pi_string.get(0..BIT + 2) {
  29.                 if slice == &PI[0..BIT + 2] {
  30.                     res.push(start.elapsed());
  31.                     break;
  32.                 }
  33.             }
  34.         }
  35.     }
  36.     let sum = res.iter().sum::<std::time::Duration>();
  37.     let min = res.iter().min().unwrap();
  38.     let max = res.iter().max().unwrap();
  39.     let avg = sum / res.len() as u32;
  40.     println!("平均耗时: {:?}", avg);
  41.     println!("最短耗时: {:?}", min);
  42.     println!("最长耗时: {:?}", max);
  43.     let variance = res
  44.         .iter()
  45.         .map(|x| {
  46.             let x = x.as_secs_f64() * 1_000.0;
  47.             (x - avg.as_secs_f64() * 1_000.0).powi(2)
  48.         })
  49.         .sum::<f64>()
  50.         / res.len() as f64;
  51.     println!("标准差: {}ms", variance.sqrt());
  52.     println!("按Enter退出……");
  53.     let _ = std::io::stdin().read_line(&mut String::new());
  54. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2024-12-11 11:44 | 显示全部楼层
开始计算……
计算完成,耗时:73.7923ms
计算次数:830

13900HX 5.2G
回复

使用道具 举报

     
 楼主| 发表于 2024-12-11 12:32 | 显示全部楼层
M2 Pro      133ms
Tensor G4 166ms
回复

使用道具 举报

发表于 2024-12-11 12:58 | 显示全部楼层
13900H

计算完成,耗时:91.0954ms
计算次数:830
回复

使用道具 举报

     
发表于 2024-12-11 13:14 | 显示全部楼层
本帖最后由 Rarity5 于 2024-12-12 12:11 编辑

9950x pbo

图裂了重跑了一次


开始计算, 50次……
平均耗时: 63.205894ms
最短耗时: 62.9254ms
最长耗时: 65.6684ms
标准差: 0.31991397806910626ms
按Enter退出……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2024-12-11 13:14 | 显示全部楼层
i7-8700
计算完成,耗时:1.3676834s
计算次数:830
回复

使用道具 举报

     
发表于 2024-12-11 13:24 来自手机 | 显示全部楼层
conanlm 发表于 2024-12-11 13:14
i7-8700
计算完成,耗时:1.3676834s
计算次数:830

你这怎么比前面的慢了10倍不止
回复

使用道具 举报

     
发表于 2024-12-11 13:31 | 显示全部楼层
8Gen3 cpu0-cpu7
计算完成,耗时:1.095225625s
计算完成,耗时:1.06972849s
计算完成,耗时:357.804063ms
计算完成,耗时:326.224583ms
计算完成,耗时:320.92276ms
计算完成,耗时:582.662552ms
计算完成,耗时:582.267812ms
计算完成,耗时:338.009687ms
回复

使用道具 举报

     
 楼主| 发表于 2024-12-11 13:33 | 显示全部楼层
0WHan0 发表于 2024-12-11 13:31
8Gen3 cpu0-cpu7
计算完成,耗时:1.095225625s
计算完成,耗时:1.06972849s

你怎么比我 tensor 还慢,开 release 优化了没
回复

使用道具 举报

     
发表于 2024-12-11 13:46 | 显示全部楼层
Xerxes_2 发表于 2024-12-11 13:33
你怎么比我 tensor 还慢,开 release 优化了没

开了release ,--target=aarch64-unknown-linux-musl编的,在termux跑的
回复

使用道具 举报

     
 楼主| 发表于 2024-12-11 13:47 | 显示全部楼层
本帖最后由 Xerxes_2 于 2024-12-11 13:49 编辑
0WHan0 发表于 2024-12-11 13:46
开了,在termux跑的

我也一样,你这个时间不太正常
termux 的 rust 工具链不用改 target,自动链接到 ndk
回复

使用道具 举报

     
发表于 2024-12-11 13:49 | 显示全部楼层
minipc 7840H
开始计算, 50次……
平均耗时: 78.749366ms
最短耗时: 74.7105ms
最长耗时: 84.7318ms
标准差: 3.148763963882335ms
回复

使用道具 举报

     
发表于 2024-12-11 13:51 | 显示全部楼层
Thinkbook 14p 13900H
开始计算, 50次……
平均耗时: 72.930502ms
最短耗时: 68.1388ms
最长耗时: 91.2223ms
标准差: 4.143961949897223ms
按Enter退出……
回复

使用道具 举报

     
发表于 2024-12-11 13:53 | 显示全部楼层
本帖最后由 chachi 于 2024-12-11 14:34 编辑

m4 max
开始计算, 50次……
平均耗时: 96.196567ms
最短耗时: 94.793042ms
最长耗时: 119.600542ms
标准差: 2.486810916164708ms
按Enter退出……


12900kf @ 5G

开始计算, 50次……
平均耗时: 75.761022ms
最短耗时: 72.9269ms
最长耗时: 78.0789ms
标准差: 1.5768690040444082ms
按Enter退出……

回复

使用道具 举报

     
发表于 2024-12-11 13:54 | 显示全部楼层
本帖最后由 0WHan0 于 2024-12-11 14:12 编辑
Xerxes_2 发表于 2024-12-11 13:47
我也一样,你这个时间不太正常
termux 的 rust 工具链不用改 target,自动链接到 ndk
...

没装ndk,在arm linux设备上编译再复制到手机上运行的。发现手机没开性能模式,开了后正常了

8Gen3 超大核
开始计算, 100次……
平均耗时: 169.320535ms
最短耗时: 159.918385ms
最长耗时: 186.841458ms
标准差: 9.859177158924634ms

回复

使用道具 举报

     
发表于 2024-12-11 13:56 | 显示全部楼层
抱歉刚才没开release
又跑了一遍
i7-8700
开始计算, 50次……
平均耗时: 188.217513ms
最短耗时: 183.8005ms
最长耗时: 212.4533ms
标准差: 3.2323712116542254ms


回复

使用道具 举报

     
发表于 2024-12-11 14:08 | 显示全部楼层
鲲鹏920
开始计算, 100次……
平均耗时: 217.670944ms
最短耗时: 217.436271ms
最长耗时: 218.943041ms
标准差: 0.20571966141183437ms
回复

使用道具 举报

     
发表于 2024-12-11 14:40 | 显示全部楼层
i5-13500H
开始计算, 50次……
平均耗时: 87.01131ms
最短耗时: 84.549ms
最长耗时: 96.5826ms
标准差: 1.6703936325609003ms
回复

使用道具 举报

     
发表于 2024-12-11 15:16 | 显示全部楼层
泥潭还是老实人居多,看着exe都敢直接下来跑
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-12-11 15:22 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2024-12-11 15:26 | 显示全部楼层
lightdog 发表于 2024-12-11 15:22
难道不是自己下载源码本地编译?

下载次数21
回复

使用道具 举报

     
发表于 2024-12-11 15:34 | 显示全部楼层

下载了不一定运行啊
macos的就是我下载的,但是我下载了就直接删了
自己起了编译器重新编译运行。
回复

使用道具 举报

     
 楼主| 发表于 2024-12-12 06:10 | 显示全部楼层
0WHan0 发表于 2024-12-11 13:54
没装ndk,在arm linux设备上编译再复制到手机上运行的。发现手机没开性能模式,开了后正常了

8Gen3 超大 ...

手机上现场编译很容易,pkg install rust 就行
musl 性能在 Android 上肯定不如 bionic
回复

使用道具 举报

     
发表于 2024-12-12 08:16 来自手机 | 显示全部楼层
Xerxes_2 发表于 2024-12-12 06:10
手机上现场编译很容易,pkg install rust 就行
musl 性能在 Android 上肯定不如 bionic ...

确实

开始计算, 100次……
平均耗时: 140.226531ms
最短耗时: 139.81625ms
最长耗时: 143.672084ms
标准差: 0.7115659121320126ms


—— 来自 鹅球 v3.2.91
回复

使用道具 举报

     
发表于 2024-12-12 08:41 | 显示全部楼层
本帖最后由 御坂MKII 于 2024-12-12 08:42 编辑

泥潭cdn炸了看不到上面 9950x 的图了
9950x pbo+co+cs
平均耗时: 66.574783ms
最短耗时: 64.9939ms
最长耗时: 71.3228ms
标准差: 1.2411646415407587ms

自从用 vscode remote dev 之后家里 windows 是死也不会装任何 toolchain 了 直接下载.jpg
回复

使用道具 举报

     
发表于 2024-12-12 08:52 | 显示全部楼层
趁着还有机会把手里能摸到的平台全测了一次

1. 英伟达GH200 Grace Hopper超级芯片(72核 3.1GHz Grace CPU,Arm64)
平均耗时: 137.628822ms
最短耗时: 137.471817ms
最长耗时: 137.842726ms
标准差: 0.062398955759374035ms

2. 富士通A64FX(48核,2.0GHz,A64FX)
平均耗时: 584.712306ms
最短耗时: 583.8118ms
最长耗时: 585.680884ms
标准差: 0.3021918232605432ms

3. AMD Threadripper 7970X(32核,4GHz,AMD64)
平均耗时: 71.702161ms
最短耗时: 70.302874ms
最长耗时: 78.725412ms
标准差: 1.8972237741037858ms

4. AMD EPYC 7763(64核,2.45GHz,AMD64)
平均耗时: 105.980221ms
最短耗时: 105.641725ms
最长耗时: 106.605192ms
标准差: 0.18465905076913988ms

5. AMD EPYC 7713(64核,2GHz,AMD64)
平均耗时: 99.705051ms
最短耗时: 99.423633ms
最长耗时: 100.449285ms
标准差: 0.1896395539691017ms

6. AMD EPYC 9684X(96核,2.55GHz,AMD64)
平均耗时: 98.076026ms
最短耗时: 97.884284ms
最长耗时: 98.530321ms
标准差: 0.09426943032669657ms

7. Intel Xeon Platinum 8470(52核,2GHz,AMD64)
平均耗时: 90.338755ms
最短耗时: 90.095926ms
最长耗时: 92.722607ms
标准差: 0.3437751782421175ms

8. Intel Xeon Gold 5515(8核,3.2GHz,AMD64)
平均耗时: 83.538375ms
最短耗时: 83.363816ms
最长耗时: 83.960109ms
标准差: 0.08369627274323516ms

9. AMD EPYC 9554(64核,3.1GHz,AMD64)
平均耗时: 96.880282ms
最短耗时: 96.639544ms
最长耗时: 97.460588ms
标准差: 0.1009808369950955ms
回复

使用道具 举报

     
 楼主| 发表于 2024-12-12 09:03 | 显示全部楼层
0WHan0 发表于 2024-12-12 08:16
确实

开始计算, 100次……

还是偏低,Tensor G4 是

平均耗时: 149.467204ms
最短耗时: 148.522787ms
最长耗时: 194.161743ms
标准差: 4.4972475433900225ms
回复

使用道具 举报

     
发表于 2024-12-12 09:08 | 显示全部楼层
草,差点忘了我们这还有亚马逊的Graviton3E,补一个

10. 亚马逊 Graviton3E(64核,2.60GHz,Arm64)
平均耗时: 187.231077ms
最短耗时: 186.923203ms
最长耗时: 187.489247ms
标准差: 0.08999772522452998ms
回复

使用道具 举报

     
发表于 2024-12-12 09:32 | 显示全部楼层
Xerxes_2 发表于 2024-12-12 09:03
还是偏低,Tensor G4 是

平均耗时: 149.467204ms

G4和8Gen3大核都是X4,一个3.1GHz一个3.3GHz,本来就应该差不了多少,加上我这是小米,调度怂的得一塌糊涂的
回复

使用道具 举报

     
发表于 2024-12-12 10:26 | 显示全部楼层
SDG8E(一加13),已开release

开始计算, 50次……
平均耗时: 207.423811ms
最短耗时: 198.811563ms
最长耗时: 215.199062ms
标准差: 3.0884865823458587ms

跑了几遍都差不多是这个结果,开性能模式没影响

回复

使用道具 举报

     
发表于 2024-12-13 22:39 | 显示全部楼层
我也来凑个热闹,摸鱼根据主楼的代码编了一版 WASM,除了把 std::time 模块改成了 Web 兼容的 API 没动其它地方。
测试 WASM 的性能还是相较本地编译 Rust 差了一大截,不过总比直接跑 JS 快,有兴趣的朋友可以比较一下。
部署地址:
https://d7b343e.pages.dev/
回复

使用道具 举报

     
发表于 2024-12-14 11:20 | 显示全部楼层
i7-11700K

开始计算, 50次……
平均耗时: 87.52722ms
最短耗时: 82.5419ms
最长耗时: 98.3927ms
标准差: 3.921176545018089ms
回复

使用道具 举报

     
发表于 2024-12-14 14:17 | 显示全部楼层
9950X 远程桌面

开始计算, 50次……
平均耗时: 100.280193ms
最短耗时: 99.8843ms
最长耗时: 102.0396ms
标准差: 0.293787420171457ms
按Enter退出……
回复

使用道具 举报

     
发表于 2024-12-14 22:44 | 显示全部楼层
M4 Pro 4+10

开始计算, 50次……
平均耗时: 94.271997ms
最短耗时: 93.522583ms
最长耗时: 122.105875ms
标准差: 2.8236965100792153ms
按Enter退出……
回复

使用道具 举报

     
发表于 2024-12-15 05:37 | 显示全部楼层
9800X3D PBO+200 金核银核-15,其他-25

开始计算, 50次……
平均耗时: 66.041094ms
最短耗时: 65.4937ms
最长耗时: 66.6359ms
标准差: 0.42044383473182234ms
按Enter退出……
回复

使用道具 举报

     
 楼主| 发表于 2024-12-15 13:59 | 显示全部楼层
本帖最后由 Xerxes_2 于 2024-12-15 14:45 编辑

更新一个用 GMP 的

Tensro G4

开始计算, 100次……
平均耗时: 4.23808ms
最短耗时: 4.197957ms
最长耗时: 4.848755ms
标准差: 0.06495393544974773ms
按Enter退出……

M2 Pro
开始计算, 100次……
平均耗时: 3.528882ms
最短耗时: 3.332416ms
最长耗时: 5.415167ms
标准差: 0.3127787027149067ms
按Enter退出……

5900X 默认

开始计算, 100次……
平均耗时: 4.042782ms
最短耗时: 3.9653ms
最长耗时: 4.4664ms
标准差: 0.07114281886459099ms
按Enter退出……
回复

使用道具 举报

     
发表于 2024-12-16 21:29 来自手机 | 显示全部楼层
8gen3手机跑楼上wasm版的

Rust(WebAssembly)计算圆周率 500 位性能测试

跑 100 次取平均

原帖地址:桌面平台CPU性能测试(单核)裸机程序:Rust计算圆周率500位

开始计算

平均耗时: 520.6529999998212ms
最短耗时: 490.90000000596046ms
最长耗时: 531.1999999880791ms
标准差: 4.590151521047946ms

等我明天弄一个android版看看原生ndk能跑多少

—— 来自 鹅球 v3.1.88.3
回复

使用道具 举报

     
发表于 2024-12-16 21:37 | 显示全部楼层
神舟笔记本 8845H
开始计算, 100次……
平均耗时: 3.94017ms
最短耗时: 3.8431ms
最长耗时: 4.5863ms
标准差: 0.15321226811192376ms
按Enter退出……
回复

使用道具 举报

     
发表于 2024-12-16 22:45 | 显示全部楼层
开始计算, 100次……
平均耗时: 3.599765ms
最短耗时: 3.4779ms
最长耗时: 4.5368ms
标准差: 0.18163586780974725ms
按Enter退出……

13900HX 5.4G
回复

使用道具 举报

     
发表于 2024-12-17 15:15 | 显示全部楼层
macmini m4

开始计算, 100次……
平均耗时: 2.494635ms
最短耗时: 2.429416ms
最长耗时: 3.198166ms
标准差: 0.13734633284289033ms
按Enter退出……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-4-21 23:35 , Processed in 0.153731 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表