想不想知道 e5 洋垃圾的性能?好家伙,我手痒了!!!
前阵子我用 Go 写了一个小工具 —— GoHyperPi!通过计算圆周率 π 的值,测试 CPU 的单核和多核性能。
代码是开源的,可以移步到 GitHub 查看 → https://github.com/Lofanmi/GoHyperPi
与传统的性能测试软件 SuperPi(只能单核)、HyperPi(支持多核但不跨平台)相比,
GoHyperPi 能更充分利用多核处理器的并行计算能力,跨平台地进行性能测试,以更全面和准确地评估计算机的处理器性能。
为什么我要写这个软件呢?
1、Super PI 这个软件是单核的,而 HyperPi 支持多核但是又不跨平台;
2、Hyper PI 使用的人偏少,跑分数据不全面;
3、我组装了双路 E5-2690 v4,我想知道它的性能是怎么样的!!!
而 Go 语言有调度器有协程,写一个并行计算的程序,对我来说这不和呼吸一样简单?
嘿嘿,仅用 200 行代码不到~
它的原理是什么?
1、-n 指定圆周率小数点后的位数。我的测试都是计算圆周率 10 万位;
2、-proc 并行数量,默认程序自动获取 CPU 的核心数量(超线程会当做真正的核心)。程序会启动一定数量的协程,计算圆周率,并测量时间;
3、-times 并行倍数。最终的跑分结果为小数点第几位每秒,倍数越高得分越高,默认 2 倍。
废话不多说,先看跑分!双路 E5-2690 v4 洋垃圾,28 核心 56 线程,单核跑分 1838.56,多核跑分 102608.14!
CPU Name: Intel(R) Xeon(R) CPU E5-2690 v4 @ 2.60GHz
CPU Physical Cores: 14
CPU Threads Per Core: 2
CPU Logical Cores: 28
CPU Family: 6 Model: 79 Vendor ID: Intel
CPU Features: ADX,AESNI,AVX,AVX2,BMI1,BMI2,CLMUL,CMOV,CMPXCHG8,CX16,ERMS,F16C,FLUSH_L1D,FMA3,FXSR,FXSROPT,HLE,HTT,IBPB,LAHF,LZCNT,MD_CLEAR,MMX,MOVBE,NX,OSXSAVE,POPCNT,RDRAND,RDSEED,RDTSCP,RTM,SPEC_CTRL_SSBD,SSE,SSE2,SSE3,SSE4,SSE42,SSSE3,STIBP,SYSCALL,SYSEE,VMX,X87,XSAVE,XSAVEOPT
CPU CacheLine bytes: 64
CPU L1 Data Cache: 32768 bytes
CPU L1 Instruction Cache: 32768 bytes
CPU L2 Cache: 262144 bytes
CPU L3 Cache: 36700160 bytes
CPU Frequency: 2600000000 Hz
OS: darwin amd64
Result:
[duration:1m49.153128188s] [single-core:1838.56] [multi-core:102608.14] [rate:55.81]
相比苹果 M1,它的单核跑分达到恐怖的 10030.69,多核跑分 79311.41!
CPU Name: Apple M1
CPU Physical Cores: 8
CPU Threads Per Core: 1
CPU Logical Cores: 8
CPU Family: 458787763 Model: 0 Vendor ID: VendorUnknown
CPU Features: AESARM,ASIMD,ASIMDDP,ASIMDHP,ASIMDRDM,ATOMICS,CRC32,DCPOP,FCMA,FP,FPHP,GPA,JSCVT,LRCPC,PMULL,SHA1,SHA2,SHA3,SHA512
CPU CacheLine bytes: 128
CPU L1 Data Cache: 65536 bytes
CPU L1 Instruction Cache: 131072 bytes
CPU L2 Cache: 4194304 bytes
CPU L3 Cache: -1 bytes
CPU Frequency: 0 hz
OS: darwin arm64
Result:
[duration:20.173640958s] [single-core:10030.69] [multi-core:79311.41] [rate:7.91]
而 i7-6700,单核跑分 2269.79,多核 17994.33,弱爆了!
CPU Name: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
CPU Physical Cores: 4
CPU Threads Per Core: 2
CPU Logical Cores: 8
CPU Family: 6 Model: 94 Vendor ID: Intel
CPU Features: ADX,AESNI,AVX,AVX2,BMI1,BMI2,CLMUL,CMOV,CMPXCHG8,CX16,ERMS,F16C,FLUSH_L1D,FMA3,FXSR,FXSROPT,HLE,HTT,IBPB,LAHF,LZCNT,MD_CLEAR,MMX,MOVBE,MPX,NX,OSXSAVE,POPCNT,RDRAND,RDSEED,RDTSCP,RTM,SGX,SPEC_CTRL_SSBD,SSE,SSE2,SSE3,SSE4,SSE42,SSSE3,STIBP,SYSCALL,SYSEE,VMX,X87,XGETBV1,XSAVE,XSAVEC,XSAVEOPT,XSAVES
CPU CacheLine bytes: 64
CPU L1 Data Cache: 32768 bytes
CPU L1 Instruction Cache: 32768 bytes
CPU L2 Cache: 262144 bytes
CPU L3 Cache: 8388608 bytes
CPU Frequency: 3400000000 hz
OS: windows amd64
Result:
[duration:1m28.91691s] [single-core:2269.79] [multi-core:17994.33] [rate:7.93]
那该如何安装呢?
1、先下载并安装 Go 编译器:https://studygolang.com/dl;
2、使用中国七牛云镜像加速安装过程,可以参考这个网站设置环境变量:Goproxy.cn;
3、执行以下命令,耐心等待成绩。
# 安装
go install github.com/Lofanmi/GoHyperPi@latest
# 跑分,多线程计算 10 万位,榨干 CPU 性能
GoHyperPi -n=100000
从我测试的跑分数据上看,多核跑分是比较准确的,而单核跑分也不是不准确,而是因为部分 CPU 存在超线程,它的单核成绩不太好计算,相比下来会弱一些。
也就是说,4 核 8 线程的 i7,单核跑分弱于 4 核 4 线程的 i5。
因为单核跑分和线程数有关,但超线程不是真正意义上的核心。目前暂时没想到更好的计算方式,等我有时间再优化 v2 版本!
先这样,晚上 12 点了,睡觉!期待大家的跑分!
2023-11-26 更新:
上面说 CPU 有超线程的话,单核跑分会偏低。因为程序会自动获取 CPU 的核心数量,超线程核心会被看成 CPU 核心去计算,解决办法是只计算 1 次,并使用 1 个 P:
# 计算单线程,可以使用下面的命令,会更加准确。
GoHyperPi -n=100000 -times=1 -proc=1
我重新跑了下分:
# 双路 e5
(待更新)
# 苹果 M1
[duration:6.124790167s] [single-core:16327.84] [multi-core:16327.09] [rate:1.00]
# E5-3666 v3
[duration:34.6047587s] [single-core:2889.82] [multi-core:2889.78] [rate:1.00]
# i5-4440
[duration:36.3002608s] [single-core:2754.80] [multi-core:2754.80] [rate:1.00]
感谢 @小学生414 5700G 在 Hyper-V Linux 下的跑分,让我们喊一句:AMD,Yes!
# AMD 5700G
[duration:14.635549286s] [single-core:13800.72] [multi-core:109322.85] [rate:7.92]
程序本身会申请一块超大的内存用来计算结果,推断大三缓的 CPU 还有内存访问效率高的苹果 arm 处理器、高频低延迟的内存,跑分都会比较强。