我开发了一款圆周率计算器 App,挑战硬件性能的极限

4 月 4 日
 Twins666

从 Super PI 说起

十几年前,DIY 装机是一件非常有仪式感的事情,每次装好一台新电脑,第一件事不是装游戏,而是跑分。

记得当时有一款软件叫 Super PI ,它的界面非常简陋,功能也只有一个——计算圆周率。选择计算 100 万位,点击开始,然后盯着屏幕,等它跑完。跑完的数字,就是你这台机器的”成绩单”。

我至今记得第一次把计算时间从 30 多秒压到 20 秒以内时的兴奋。换了根内存条,速度快了 3 秒;超频到 3.6GHz ,又快了 2 秒。那种将硬件性能“可视化”的感觉,简单、直接、让人上瘾。

一个念头

随着 PC 时代的逐渐退场,我的设备变成了 iPhone 、iPad 和 Mac 。

有一天,我突然想:我手上的 iPhone ,算 100 万位圆周率要多久?

找了一圈,App Store 上的相关应用,要么是给小朋友背圆周率的,要么就是展示几十位小数的计算结果。没有一款应用,能让我像当年用 Super PI 那样,认真地跑一次大规模计算,然后和别人比较:“你的 iPhone 15 跑了多少秒?我的 iPhone 16 快了多少?”

这个需求看起来可能很小众,但我知道,一定有人和我一样会感兴趣。

于是,我决定自己动手做一个。

算法的选择

要做就做认真的。

圆周率的计算算法有很多,从莱布尼茨公式到 Machin 类公式,我最终选择了 Chudnovsky 算法。原因很简单——它是目前世界纪录保持者使用的算法,每一项能贡献约 14 位有效数字,收敛速度极快。

但 Chudnovsky 算法只是公式层面的选择。真正决定性能的是实现层面: • Binary Splitting (二分分裂):将级数求和转化为大整数的分治运算,避免了逐项累加导致的精度损失。 • NTT (数论变换):大整数乘法的核心,将 O(n²) 的复杂度降到 O(n log n)。 • 多核并行:充分利用 A 系列和 M 系列芯片的多核架构进行加速。

这些听起来像是教科书上的名词,但真正写下去才知道,每一个技术实现背后,都是一个深坑。

开发中的取舍

精度 vs 速度,是我面临的第一个取舍。

我没有使用任何第三方大数库,整个大整数运算( BigInt )完全从零开始用 Swift 实现。这意味着我可以对 Apple 芯片进行最细粒度的优化,但也意味着每个基础运算——加、减、乘、除、取模、开方——都得自己实现、调试,确保它们是正确的。

一个 NTT 乘法的 bug 可能不会让 1000 位的结果出错,但可能在 100 万位时悄悄出问题。为了确保准确,我花了大量时间做交叉验证,逐位对比,确保每一位都是正确的。

功能的克制,是另一个取舍。

我本可以加入更多跑分功能、排行榜、社交分享等,但我最终选择了克制。这个 App 的核心就是:在你的设备上,认真计算一次圆周率,告诉你用了多长时间。

在此基础上,我加了一些自己想要的功能: • 数字搜索:想知道你的生日在圆周率的第几位吗? • 分享卡片:设计过的卡片,记录你的设备、计算位数、耗时。 • 计算历史:追踪每次计算的成绩,见证设备性能的变化。 • 圆周率知识:关于 π 的趣味故事、历史和算法介绍。

每个功能都是因为”我自己想用”才加的,而不是为了凑功能列表。

一些感悟

开发这个 App 的过程,本身就像一次性能测试——测的是我自己。

写 BigInt 时,我重新拾起了大学时代的数论知识,才发现那些曾经觉得”没什么用”的定理,竟然能让一个乘法快上百倍。

调试多核并行时,我学到了一件事:并行计算不是免费的午餐。任务拆分、内存竞争、同步开销,最终的加速效果远不是”核心数倍”那么简单,能看到显著提升已经很值得欣慰。

而在打磨 UI 时,我反复思考的是:如何让一个“等待计算完成”的过程不那么焦虑?进度百分比要平滑地前进,哪怕后台计算可能在某个阶段停滞。用户不需要知道每一步的具体细节,只需要看到数字在动,知道程序在跑。

最后

这个 App 注定不会成为大众产品。

但如果你曾在深夜里盯着 Super PI 的进度条,等待一个数字来证明你的硬件没有白买;如果你好奇手中的设备在面对一个纯粹的数学问题时,能跑得多快——

那么,这个 App 就是为你做的。

关于内购

我知道很多人对内购持保留态度,因此我想诚恳地说明:这个 App 绝对不会影响你基本的使用体验。免费版本可以计算最多 1000 位圆周率。如果你希望计算更多位数,或者想尝试更多高级功能,比如数字搜索、多核并行计算等,可以选择 Pro 版本,价格比一杯咖啡还便宜。

我的初衷并不是为了推销,而是提供一个让你体验硬件性能并享受数学之美的工具。内购只是为了让你在体验过程中,能够更好地使用它,并支持我的持续开发。

下载链接: https://apps.apple.com/app/pi-digits-calculator/id6761232095

算一次 π,看看你的设备有多快。

1807 次点击
所在节点    分享创造
14 条回复
eBMm8zIi0Zq3
4 月 4 日
免费版本计算 1000 位太幽默了
Twins666
4 月 5 日
@eBMm8zIi0Zq3 我的错,太不好意思了,正在准备更新版本,预计下周上架,届时免费版也能计算 100 万位
junyee
4 月 5 日
确实 1000 位 , STM32 都有资格加入嘲讽队列.
Twins666
4 月 5 日
@junyee 承认错误,虚心接受大家批评
Twins666
4 月 5 日
先分发 20 个促销码,请各位感兴趣的大佬试用。如果方便的话,麻烦使用后帮忙给个真实的评价。我目前正在准备新版本,新版本会加入压力测试功能,可以重复跑多次测试,看看成绩是否稳定。另外,新版本会把免费版的计算位数提高到 100 万位。预计新版本下周可以上架。对于目前免费版只能计算 1000 位的问题,再次向大家表示歉意! 20 个促销码如下:
苹果 App Store:
7F7N347WAEW4
4EMH3NHFYF4Y
YPLJAMNEK7YH
FJJJA33HER6W
P733L6PXXANY
L9FA796JHXE7
PRFRXA7339A3
37KWLNKKEAR9
TL3YEH4THKRE
3HJLYJNMP36M
TH4XLW44MJ4X
7WK6ARF4TJYL
TEJJ6KMM63YX
KFJTT9JPJXLA
RTWLFRKHYAAR
MLPALEXTR7KH
KNLLKJ7LFAMW
4LJNKMYAFPNR
3K3NA9M9RRYK
W6NFR9L7N7FE
goodryb
4 月 5 日
op 执行力超强,不过跑分有 geekbench ,还能多平台,单跑 iOS 似乎只能看看 A 系列的,一众 Android 也没法比
Twins666
4 月 5 日
@goodryb 就像我上文说的,主要还是对圆周率有个老旧的情怀。不想跟 geekbench 竞争,也没这个时间和精力。作为一个轻量级的跑分,玩玩还是可以的。至于 Android ,确实有这个打算开发对应的版本。另外,这个是苹果全平台的,可以跑在 M 系列 CPU 的 Mac 上。可以看看 Mac 的跑分,也能看看 Apple Watch 的跑分。我的 Apple Watch S10 的跑分是 100 万位 33 秒多点
duxiansen
4 月 6 日
为啥每次兑换完都会重新下载一遍,但是都没解锁内购?
Twins666
4 月 6 日
@duxiansen 好像我用错了促销代码和优惠代码,苹果说前者正在被后者替代,晚点我生成一批优惠代码再重新发给大家,应该能实现解锁内购。再次感谢关注!
Twins666
4 月 6 日
请使用以下的优惠代码,应该可以永久激活内购,请大家试用。试用后,请尽可能帮忙在 App Store 里给个评价,非常感谢!之前的代码有问题,请大家忽略。
苹果 App Store:
LFX6MEXAKLTEF7EREW
TXFE68KR6NY78YWKLM
66YY3LLNX63MY44LRA
7KH7JRFRMLY8YWYA8N
JY3F86AYFE63KRM4NX
L4HNX4P7XX8FFN6AYP
WJL44HWT7X3TF4YXWF
HT3EPP7F6EYLNYLT3E
KFHL6FH3JAKM63PKHR
WFRPP6MW7KFF7FXJEW
XH4TXMFL34XHF8H3KE
FFH4A4HHHAJ3WK6Y3K
868RM8FMPF66N8YJ6T
HAKFR38YHY3PHEYFP7
MJPPHLXEJHYJK4FTMW
7Y6NPLXLRX8NWJLYAR
KXWN7FLNF4XMHT7LLK
F3JYNAF7WTRJJWAAJT
3ERXJFANFXRAFETFLR
PYH3NHRHM84AKYXNE4
Twins666
4 月 6 日
@duxiansen 我在 10 楼重新发了兑换码,这次应该没有问题,谢谢关注!
duxiansen
4 月 6 日
这次没问题了,已兑换
Twins666
4 月 7 日
@duxiansen 感谢!方便的话,APP store 里给个评价
Twins666
4 月 25 日
版本更新了,新增了全球排行榜功能,特别想看到大家的苹果设备成绩如何。感兴趣的可以装一个玩玩:
下载链接: https://apps.apple.com/app/super-pibench/id6761232095
兑换码如下:
LFX6MEXAKLTEF7EREW
TXFE68KR6NY78YWKLM
66YY3LLNX63MY44LRA
7KH7JRFRMLY8YWYA8N
JY3F86AYFE63KRM4NX
L4HNX4P7XX8FFN6AYP
WJL44HWT7X3TF4YXWF
HT3EPP7F6EYLNYLT3E
KFHL6FH3JAKM63PKHR
WFRPP6MW7KFF7FXJEW
XH4TXMFL34XHF8H3KE
FFH4A4HHHAJ3WK6Y3K
868RM8FMPF66N8YJ6T
HAKFR38YHY3PHEYFP7
MJPPHLXEJHYJK4FTMW
7Y6NPLXLRX8NWJLYAR
KXWN7FLNF4XMHT7LLK
F3JYNAF7WTRJJWAAJT
3ERXJFANFXRAFETFLR
PYH3NHRHM84AKYXNE4

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1203531

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX