ここ1週間ぐらい前から、go言語でコードを書き始めた初心者です。
質問は、"go run"や"go buiold/install"などのコンパイル時間を短くする方法(作法)を知りたく質問しました。
少し現状を記しておきます。
現在goを使って、プログラムを書いています。
説明が分かりにくくなりますので、ここではmain.goとmypackage.goの2つファイルを作成している状況を仮定します。main.goにはfunc main()があり、mypackage.goにはその他のfuncを書いています。
自分の行いたいことに対し、goの標準的なlibraryが使えないため、自分でfuncを多数作成し、それをまとめたファイル(mypackage.go)を作成しています。それをmain.goの中でimportで呼び込んで、プログラムの動作("go run main.go")を確認しています。
この方法で、現在コードを作成・コンパイル・実行を行っていますが、
mypackage.goが数百行を超えたあたりから、コンパイルに非常に長い時間(4-6分以上)かかってしまっていて困っています。mypackage.goのfuncをすべてmain.goに移植しても同じ結果でした。まだmypackage.goにfuncを書き足していく予定のため、今後さらにコンパイル時間がかかると予想します。
コンパイル時間の短縮についてwebで調べたところ、毎回mypackage.goを呼び込んでいることが、余計に時間がかかっているとの記述を見つけました。そこで、go installしたあと、go build/runする方法をとりました。この方法自体を行うと、install後のコンパイルに時間がかからなくなりますが、mypackage.goを手直ししたら、(当たり前ですが)また再度同じ動作をしないと手直し部分がプログラム結果に反映されません。
mypackage.goを手直ししながらすばやくコンパイルを行い、実行結果を見ることは可能でしょうか?
コンパイル時間が短いということでgoを使い始めましたが、初歩の初歩で躓いており、お恥ずかしい限りです。皆様はどのように自作のmypackage.goを時間をかけずにコンパイルしているのでしょうか?
ご教授をお願いします。
[]byte
をコンパイルしようとして、えらく時間がかかった記憶があります。 – KoRoN Aug 25 '15 at 01:20argusさん、
mypackage.goが大きくなりすぎたため、関数を複数のファイルに分散し各関数をtestした後にmypackage.goに入れています。ただし、関数間でお互いを参照しているものがあるので、そこまで小さくはならず、結果としてコンパイル時間の短縮につながっていないのが現状です。
巨大な配列はないと思います。やっていることは、5Mbぐらいの写真を取り込んで、[]intや[]float64を10個ぐらい作成しているぐらいですので、たぶん大丈夫だと思います。[][]float64などが原因かもしれませんけど。
アドバイスに感謝します。
– nescafe Aug 25 '15 at 14:41その原因だけではないと思いますが、かなりコンパイル時間が改善されましたので、簡単なコードを説明させていただきます。
コード: package main
import "fmt"
type ImgInfo struct { MaxColSize int MaxRowSize int
GREEN [1040][1388]float64 //←原因 }
func Show(Img ImgInfo) { fmt.Println(Img.MaxColSize, Img.MaxRowSize) Img.MaxColSize++ fmt.Println(Img.MaxColSize, Img.MaxRowSize) }
func main() { Img := ImgInfo{} Show(Img) }
コメントを記したところ(GREEN [1040][1388]float64)が原因ではないかと考えています。このコードをコンパイルしますと、約11秒かかりますが、 この行をGREEN[][]floatにしますと、0.2秒でコンパイルは終了します。(もちろん結果は同じです。)
– nescafe Aug 25 '15 at 19:51実際には、このような行が多数あり、それぞれがコンパイル時間に影響を及ぼし、合計で6分もコンパイル時間がかかってしまっていたと思われます。
大変勉強になりました。これからもよろしくお願いします。
– nescafe Aug 25 '15 at 19:55