2015-06-19 82 views
-2

考慮以下基準:去運行,性能

package main 

import (
    "io/ioutil" 
    "os" 
    "os/exec" 
    "testing" 
) 

func BenchmarkRun(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     source := `package main 

import "fmt" 

func main() { 
    fmt.Println("foo") 
}` 
     if err := ioutil.WriteFile("cmd.go", []byte(source), 0777); err != nil { 
      b.Error(err) 
     } 
     defer os.Remove("cmd.go") 

     if err := exec.Command("go", "run", "cmd.go").Run(); err != nil { 
      b.Error(err) 
     } 
    } 
} 

這周圍0.3秒需要每個操作。

有什麼辦法可以加快編譯/運行週期嗎?

寫一個臨時文件和執行exec運行似乎很笨拙。有沒有辦法在不這樣做的情況下調用編譯器?

+1

號編譯器依賴於輸入的文件,但你可以直接調用編譯器,但我懷疑節省mkdir'調用來創建臨時目錄中的情侶'將會節省很多時間。 – JimB

回答

1

您可以隨時創建一個二進制文件並稍後使用它。 例子:

package main 

import (
     "io/ioutil" 
     "os" 
     "os/exec" 
     "path" 
     "testing" 
) 

func BenchmarkRun(b *testing.B) { 
     tmpdir, err := ioutil.TempDir("", "go-bench-") 
     if err != nil { 
       b.Fatal(err) 
     } 
     defer os.RemoveAll(tmpdir) 

     source := `package main 

import "fmt" 

func main() { 
    fmt.Println("foo") 
}` 
     if err := ioutil.WriteFile(path.Join(tmpdir, "cmd.go"), []byte(source), 0777); err != nil { 
       b.Fatal(err) 
     } 
     defer os.Remove(path.Join(tmpdir, "cmd.go")) 

     cmd := exec.Command("go", "build", "-o", "cmd", ".") 
     cmd.Dir = tmpdir 
     if err := cmd.Run(); err != nil { 
       b.Fatal(err) 
     } 
     defer os.Remove(path.Join(tmpdir, "cmd")) 

     b.ResetTimer() 
     for i := 0; i < b.N; i++ { 
       if err := exec.Command(path.Join(tmpdir, "cmd")).Run(); err != nil { 
         b.Error(err) 
       } 
     } 
}