2016-09-08 9 views
1

N行/秒を印刷したいと思います。Golangでは、1秒間に何回もコマンドを何回実行するのですか?

for i := 0; i < N; i++ { 
    fmt.Println(getLogs()) 
    time.Sleep(1000000000/N * time.Nanosecond) 
} 

しかし、それはfmt.Println()ようだとgetLogs()も時間を消費します。実際には、N行を印刷するには1s以上の費用がかかります。

セイgetLogs()fmt.Println()はいずれも1msです。そして、毎秒100万行を印刷したいと思います。したがって、1行を印刷するには、1秒でgetLogs()、印刷には1ms、スリープには1ms ... N行を印刷するには3秒かかります。

これをより正確に達成するためのより良い解決策はありますか?

+0

ようtime.Tickerものを使用することができます?私は本当にあなたの目的を得ることはありません。書かれているように、Nが増えるとスリープ時間が減少する – Plato

+0

@Platoティッカーは、ティッカーがfmt.PrintlnとgetLogsと並行して時間をカウントする場合に機能し、 – Pao

答えて

5

あなたは(The Go Playgroundを試してみてください)time.NewTickerを使用することがあります。

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    const N = 4 
    ticker := time.NewTicker(1000000000/N * time.Nanosecond) 
    for i := 0; i < N; i++ { 
     fmt.Println(getLogs(i)) 
     <-ticker.C 
    } 
    ticker.Stop() 
} 

func getLogs(i int) int { 
    time.Sleep(1 * time.Millisecond) 
    return i 
} 

出力:

NewTickerが新しいを返します。

0 
1 
2 
3 

func NewTicker(d Duration) *Tickerドキュメントを参照してください。には、duration引数で指定されたピリオドで 時間を送信するチャネルが含まれています。それは、遅い受信者を補うために、 間隔を調整したり、ダニを落としたりします。継続時間d はゼロより大きくなければなりません。そうでない場合、NewTickerがパニックになります。関連付けられたリソースを解放するには ティッカーを停止します。また


参照:Running code at noon in Golang

0

は、あなたはおそらく、[time.NewTicker()](https://godoc.org/time#NewTicker)

for range time.Tick(time.Duration(1000000000/N) * time.Nanosecond){ 
    fmt.Println(getLogs()) 
    if cond { 
     break 
    } 
} 
関連する問題