计算方法
由莱布尼兹公式变形后得到的
要是想用其他算法可以参考这里https://www.zhihu.com/question/312520105
代码
c
//莱布尼兹公式求PI 取MAX k=1,000,000,000
#include<stdio.h>
#define TIMES 1000000000
int main()
{
long double pi=0;
for (double i = 0; i < TIMES; i++)
{
pi += 1 / ((4 * i + 1) * (2 * i + 1) * (i + 1));
}
pi *= 3;
printf("%.12llf", pi);
}
python
pi=0;
MaxK=1000000000
i=0
while(i<MaxK):
pi += 1 / ((4 * i + 1) * (2 * i + 1) * (i + 1));
i+=1
pi *= 3;
print(f"{pi:.12f}");
运行结果
运行环境都是VS2019,64位处理器,intel i7 8550U 3.24MHZ(基准1.8MHZ) C代码分为
- DEBUG模式,没有优化。x86
- RELEASE,x86
- RELEASE,x86-64
Python使用得是CPython
这里采用了VS自带的代码分析器,感觉计时代码影响实际结果更精确一点,不过也没差。
VS的编译器和GCC的优化上有区别,各有千秋,同样的C代码速度不同,似乎VS更快一点?
C/C++
Python
等了10几分钟,真TM后悔选了个这么大的数
无优化下速度相差186.8倍。一般而言C/C++要比python快150~400倍
C/C++(release)
C/C++(release x64)
优化前后C代码速度差别大概是3倍。
优化后的C是PY的629.897 ÷ 1.825 =345.14倍。( ̄_, ̄ )
比较奇怪得是64位程序居然比32位要慢,我没大想明白,我猜可能是和处理器字长和程序里得数据长度有关。关于这个问题我在网上也没有找到相似的问题,唯一一个相似的问题是在讲android,是由于x64指针寻址更慢导致的。但在同一cpu上应该不成立这个条件。
弄明白了https://stackoverflow.com/questions/9283717/why-c-program-compiled-for-x64-platform-is-slower-than-compiled-for-x86 虽然我没看懂我自己程序的汇编代码但是我觉得差不多是这个问题了。也就是说,编译器的锅。
结
解释型语言和编译型语言速度差别巨大,虽然针对各自的特点能对一些特别的地方进行优化,(比如记得java这种半解释型语言可以在运行时进行预测编译,从而在某些动态场景下比C/C++更快)但一般运行时的速度差别是由于语言性质决定的,只能无限得逼近编译行语言.
顺便贴一份自己看到的测试结果吧:https://cloud.tencent.com/developer/news/299769