我写了一段代码来对10000的完美数字进行基准测试。原始代码在这里,用C语言表示:
#包括 int isPerfectNumber(int num) { if (num == 1) {返回0;} int i,c= num - 1;for (i = 2;i <= num / 2;++i) { if (num %i == 0) {c -= 0;}返回c == 0;} int main(int argc,char* argv[]) { int i;for (i =0;i< 10000;++i) { if (isPerfectNumber(i)) { printf("%d\n",i);}返回0;}
然后,我用许多不同的语言(C、C#、Java、V8 Javascript、Python )编写了相同的代码。
经过基准测试,我得到了以下结果:
除了Go之外,我几乎完全预料到了这种最快到最慢的模式。为什么我的Go实现这么慢?我承认我对Go知之甚少,但我的印象是,由于Go是一种编译语言,所以它的速度可能与C#一样快。
以下是我的Go实现:
package main
import "fmt"
func main() {
for i := 0; i < 10000; i++ {
if (isPerfectNumber(i)) {
fmt.Println(i)
}
}
}
func isPerfectNumber(num int) bool {
if num == 1 { return false }
c := num - 1
for i := 2; i <= num / 2; i++ {
if num % i == 0 { c -= i }
}
return c == 0
}我是刚刚搞砸了什么,还是我看到的结果是准确的?
FYI:我通过在没有计时的情况下运行10次代码进行基准测试,然后再运行20次,并对这20个测试进行平均测试。
发布于 2017-02-13 19:17:43
我把这个号码打到了100000上,并对其进行了分析。在这里,模块操作似乎是最昂贵的:
ROUTINE ======================== main.isPerfectNumber in /tmp/so/main.go
31.72s 31.72s (flat, cum) 100% of Total
. . 19: if num == 1 {
. . 20: return false
. . 21: }
. . 22:
. . 23: c := num - 1
2.35s 2.35s 24: for i := 2; i <= num/2; i++ {
29.37s 29.37s 25: if num%i == 0 {
. . 26: c -= i
. . 27: }
. . 28: }
. . 29:
. . 30: return c == 0在这里,C编译器似乎能够优化模块化,而Go编译器则不能。我建议在Go bug跟踪器上发表一个关于这个问题的文章。如果C能做到这一点,那就去吧。
https://codereview.stackexchange.com/questions/155195
复制相似问题