为什么这个Go程序这么慢?

问题描述 投票:1回答:1

我不熟悉Golang。我刚刚阅读了Golang的一些简短教程,并编写了一个简单的程序筛。 Sieve使用sieve算法来打印所有小于10000的质数,这会创建很多go例程。我得到了正确的结果,但是程序非常慢(在我的计算机上为5秒)。我还编写了实现相同算法的lua脚本和python脚本,并且运行速度更快(两者在我的计算机上均为1秒左右)。

我的问题是,为什么我在golang中实现的筛分程序这么慢?这是golang代码:

package main

import (
  "fmt"
  "sync"
)


type Sieve struct {
  id int;
  msg_queue chan int;
  wg *sync.WaitGroup;
}


func NewSieve(id int) *Sieve {
  sieve := new(Sieve)
  sieve.id = id
  sieve.msg_queue = make(chan int)
  sieve.wg = new(sync.WaitGroup)
  sieve.wg.Add(1)
  return sieve
}


func (sieve *Sieve) run() {
  defer sieve.wg.Done()

  myprime := <-sieve.msg_queue
  if myprime == 0 {
    return
  }
  fmt.Printf("Sieve (%d) is for prime number %d.\n", sieve.id, myprime)

  next_sieve := NewSieve(sieve.id + 1)
  go next_sieve.run()
  for {
    number := <-sieve.msg_queue
    if number == 0 {
      next_sieve.msg_queue <- number;
      next_sieve.wg.Wait()
      return
    } else if number % myprime != 0 {
      fmt.Printf("id: %d, number: %d, myprime: %d, number mod myprime: %d\n", sieve.id, number, myprime, number % myprime)
      next_sieve.msg_queue <- number
    }
  }
}


func driver() {
  first := NewSieve(2)
  go first.run()
  for n := 2; n <= 10000; n++ {
    first.msg_queue <- n
  }
  first.msg_queue <- 0
  first.wg.Wait()
}


func main() {
  driver()
}

作为比较,这是sieve.lua的代码

function sieve(id)
  local myprime = coroutine.yield()
  print(string.format("Sieve (%d) is for prime number %d", id, myprime))

  local next_sieve = coroutine.create(sieve)
  coroutine.resume(next_sieve, id + 1)

  while true do
    local number = coroutine.yield()
    if number % myprime ~= 0 then
      print(string.format("id: %d, number: %d, myprime: %d, number mod myprime: %d", id, number, myprime, number % myprime))
      coroutine.resume(next_sieve, number)
    end
  end
end


function driver()
  local first = coroutine.create(sieve)
  coroutine.resume(first, 2)
  local n
  for n = 2, 10000 do
    coroutine.resume(first, n)
  end
end

driver()
go lua goroutine
1个回答
1
投票

无意义的微基准产生毫无意义的结果。

© www.soinside.com 2019 - 2024. All rights reserved.