首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全数基准

完全数基准
EN

Code Review用户
提问于 2017-02-12 22:27:06
回答 1查看 80关注 0票数 2

我写了一段代码来对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 )编写了相同的代码。

经过基准测试,我得到了以下结果:

  • C: 92.8毫秒
  • C#:97.9ms
  • 围棋: 208.85毫秒
  • 爪哇: 130.65毫秒
  • V8 Javascript: 279.15 ms
  • Python: 1126.35 ms

除了Go之外,我几乎完全预料到了这种最快到最慢的模式。为什么我的Go实现这么慢?我承认我对Go知之甚少,但我的印象是,由于Go是一种编译语言,所以它的速度可能与C#一样快。

以下是我的Go实现:

代码语言:javascript
复制
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个测试进行平均测试。

EN

回答 1

Code Review用户

回答已采纳

发布于 2017-02-13 19:17:43

我把这个号码打到了100000上,并对其进行了分析。在这里,模块操作似乎是最昂贵的:

代码语言:javascript
复制
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能做到这一点,那就去吧。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/155195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档