Xerxes_2 发表于 2024-12-11 11:42

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

本帖最后由 Xerxes_2 于 2024-12-15 14:52 编辑

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

      loop {
            let big_g = (&r.square() - (big_m.as_ref() / 2u8).square())
                .sqrt_with_context(&cx)
                .unwrap();
            let j = &r - big_g;
            let m = ((big_m.as_ref() / 2u8).square() + j.square())
                .sqrt_with_context(&cx)
                .unwrap();
            polygon = polygon * 2u8;
            let perimeter = &polygon * &m;
            let pi = &perimeter / 2u8;
            big_m = Cow::Owned(m);
            let pi_string = pi.to_string();
            const PI: &str = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989";
            if pi_string == PI {
                res.push(start.elapsed());
                break;
            }
      }
    }
    let sum = res.iter().sum::<std::time::Duration>();
    let min = res.iter().min().unwrap();
    let max = res.iter().max().unwrap();
    let avg = sum / res.len() as u32;
    println!("平均耗时: {:?}", avg);
    println!("最短耗时: {:?}", min);
    println!("最长耗时: {:?}", max);
    let variance = res
      .iter()
      .map(|x| {
            let x = x.as_secs_f64() * 1_000.0;
            (x - avg.as_secs_f64() * 1_000.0).powi(2)
      })
      .sum::<f64>()
      / res.len() as f64;
    println!("标准差: {}ms", variance.sqrt());
    println!("按Enter退出……");
    let _ = std::io::stdin().read_line(&mut String::new());
}


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

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

      loop {
            big_m.square_mut();
            big_m.div_assign_round(4, Round::Nearest);
            let big_g = (R - big_m.to_owned()).sqrt();
            let j = R - big_g;
            big_m.add_assign_round(j.square(), Round::Nearest);
            big_m.sqrt_mut();
            polygon *= 2;
            let perimeter = big_m.to_owned() * &polygon;
            let mut pi = perimeter;
            pi.div_assign_round(2, Round::Nearest);
            let pi_string = pi.to_string();
            const PI: &str = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989";
            if let Some(slice) = pi_string.get(0..BIT + 2) {
                if slice == &PI {
                  res.push(start.elapsed());
                  break;
                }
            }
      }
    }
    let sum = res.iter().sum::<std::time::Duration>();
    let min = res.iter().min().unwrap();
    let max = res.iter().max().unwrap();
    let avg = sum / res.len() as u32;
    println!("平均耗时: {:?}", avg);
    println!("最短耗时: {:?}", min);
    println!("最长耗时: {:?}", max);
    let variance = res
      .iter()
      .map(|x| {
            let x = x.as_secs_f64() * 1_000.0;
            (x - avg.as_secs_f64() * 1_000.0).powi(2)
      })
      .sum::<f64>()
      / res.len() as f64;
    println!("标准差: {}ms", variance.sqrt());
    println!("按Enter退出……");
    let _ = std::io::stdin().read_line(&mut String::new());
}

纸冰心 发表于 2024-12-11 11:44

开始计算……
计算完成,耗时:73.7923ms
计算次数:830

13900HX 5.2G

Xerxes_2 发表于 2024-12-11 12:32

M2 Pro      133ms
Tensor G4 166ms

muderx 发表于 2024-12-11 12:58

13900H

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

Rarity5 发表于 2024-12-11 13:14

本帖最后由 Rarity5 于 2024-12-12 12:11 编辑

9950x pbo

图裂了重跑了一次


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

conanlm 发表于 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倍不止

0WHan0 发表于 2024-12-11 13:31

8Gen3 cpu0-cpu7
计算完成,耗时:1.095225625s
计算完成,耗时:1.06972849s
计算完成,耗时:357.804063ms
计算完成,耗时:326.224583ms
计算完成,耗时:320.92276ms
计算完成,耗时:582.662552ms
计算完成,耗时:582.267812ms
计算完成,耗时:338.009687ms

Xerxes_2 发表于 2024-12-11 13:33

0WHan0 发表于 2024-12-11 13:31
8Gen3 cpu0-cpu7
计算完成,耗时:1.095225625s
计算完成,耗时:1.06972849s


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

0WHan0 发表于 2024-12-11 13:46

Xerxes_2 发表于 2024-12-11 13:33
你怎么比我 tensor 还慢,开 release 优化了没
开了release ,--target=aarch64-unknown-linux-musl编的,在termux跑的

Xerxes_2 发表于 2024-12-11 13:47

本帖最后由 Xerxes_2 于 2024-12-11 13:49 编辑

0WHan0 发表于 2024-12-11 13:46
开了,在termux跑的
我也一样,你这个时间不太正常
termux 的 rust 工具链不用改 target,自动链接到 ndk

cishta 发表于 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退出……

chachi 发表于 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退出……

0WHan0 发表于 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

conanlm 发表于 2024-12-11 13:56

抱歉刚才没开release
又跑了一遍
i7-8700
开始计算, 50次……
平均耗时: 188.217513ms
最短耗时: 183.8005ms
最长耗时: 212.4533ms
标准差: 3.2323712116542254ms


0WHan0 发表于 2024-12-11 14:08

鲲鹏920
开始计算, 100次……
平均耗时: 217.670944ms
最短耗时: 217.436271ms
最长耗时: 218.943041ms
标准差: 0.20571966141183437ms

zsp0009_cn 发表于 2024-12-11 14:40

i5-13500H
开始计算, 50次……
平均耗时: 87.01131ms
最短耗时: 84.549ms
最长耗时: 96.5826ms
标准差: 1.6703936325609003ms

费雷拉 发表于 2024-12-11 15:16

泥潭还是老实人居多,看着exe都敢直接下来跑

lightdog 发表于 2024-12-11 15:22

费雷拉 发表于 2024-12-11 15:26

lightdog 发表于 2024-12-11 15:22
难道不是自己下载源码本地编译?

下载次数21

chachi 发表于 2024-12-11 15:34

费雷拉 发表于 2024-12-11 15:26
下载次数21

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

Xerxes_2 发表于 2024-12-12 06:10

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

8Gen3 超大 ...

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

0WHan0 发表于 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

御坂MKII 发表于 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

Xerxes_2 发表于 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

0WHan0 发表于 2024-12-12 09:32

Xerxes_2 发表于 2024-12-12 09:03
还是偏低,Tensor G4 是

平均耗时: 149.467204ms

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

nuIIptr 发表于 2024-12-12 10:26

SDG8E(一加13),已开release

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

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

Junakr 发表于 2024-12-13 22:39

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

godke 发表于 2024-12-14 11:20

i7-11700K

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

bestword 发表于 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退出……

zmw_831110 发表于 2024-12-15 05:37

9800X3D PBO+200 金核银核-15,其他-25

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

Xerxes_2 发表于 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退出……
页: [1] 2
查看完整版本: 桌面平台CPU性能测试(单核)裸机程序:Rust计算圆周率500位