2017-03-25 20 views
0

私はコードの繰り返しを許可したくありません。しかし、私は実行時間を測定したいすべての機能でそれを繰り返す必要がある状況があり、何もできません。例えば 、機能:golangコードの挿入/置き換え

func someFunc() { 
    start_time := time.Now() 
    defer fmt.Println("Execution time: %v", time.Now().Sub(start_time)) 
    <... doing some bussiness ...> 
} 

今、私はすべての機能で、この二つの第一のストロークを繰り返す必要があります(と元に、彼らがために、関数の名前を呼んで、より複雑です)。だから私は時間を測定する関数を作ることができません。なぜなら、私はそれの内部で遅延を使わなければならないからです。私は第2ストロークでも関数を作ることができません。なぜなら、オリジナルではPrintlnの関数名を呼び出すため、その結果の名前は必要な機能にならないからです。

func someFunc() { 
//go-insert measuretime.tmpl 
    <... doing some bussiness ...> 
} 

そしてmeasuretime.tmplです:

start_time := time.Now() 
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time)) 

答えて

1

このトリックは役立つかもしれない: は、いくつかのラベルやテンプレートによって、このコードを挿入する方法は、たとえば、次のようにありますコールを延期します開始時刻を囲む関数を返す関数に渡します。

func elapsed() func() { 
    start := time.Now() 
    return func() { 
     fmt.Println("Duration was", time.Since(start)) 
    } 
} 

次のようにそれを呼び出す:

defer elapsed()() 

Have a play

はベンチマークが行くでパフォーマンスを測定する通常の方法である、と述べました。 how to write benchmarks in Goを参照してください。

+0

よろしくお願いします。私が欲しいのとまったく同じではないが、それでも。そして、私はコードの挿入に興味がありますが、内部関数呼び出しを避けるためです。この場合、return func()では無名関数になります。 –

関連する問題