2016-03-29 12 views
-3

以下のコードを実行すると、プログラムは約1.5Mで起動し、6.4Mまで徐々に増加します。なぜ私は思っています。 を削除します。スレーブは問題を修正します。Go:time.sleepとメモリの使用

デフォルトのfor-selectパターンを使用する方法はありますか?memを変更しないでデフォルトでいくつかの時間をスリープしますか?

sleepの後にruntime.GC()を呼び出すと問題が解決されます。 GCを呼び出すことなく同じことを達成できますか?同じ

package main 

import (
    "time" 
) 

func main() { 
    c := make(chan struct{}) 
    for { 
     select { 
     case <-c: 
      //some work 
     default: 
      //some work 
      time.Sleep(time.Millisecond * 1) 
     } 
    } 
} 

:いくつかの時間の研究の後

package main 

import (
    "time" 
) 

func main() { 
    c := make(chan struct{}) 
    for { 
     select { 
     case <-c: 
     case <-time.After(time.Millisecond * 10): 
     } 
    } 
} 

、私は次のコードでそれを達成しました。 time.sleepがmemの使用量を増やすのはどうしてですか?

package main 

import (
    "time" 
) 

func main() { 
    c := make(chan bool) 
    timer := time.NewTimer(0) 
    for { 
     select { 
     case <-c: 
     default: 
      timer.Reset(time.Millisecond * 1) 
      <-timer.C 
     } 
    } 
} 
+2

Time.Sleepは「メモリを増やしません」。メモリ消費量や使用量、実際に使用されているもの、いつ、どのようなメモリが解放され、OSに返されるかは非常に複雑です。 – Volker

+0

時間を使用して.Timerはトリックをしました。私はあなたがそれが複雑だと言う時、あなたを信じています。 – user3283107

+1

gctraceの出力を見て、GCが何をしているかを確認してください。スリープには小さな割り当てが必要で、最終的にはスリープする必要があります。本当の "仕事"をしているのであれば、おそらくいくつかの割り振りが必要になります。 GCは瞬間的ではなく、実行前にあるしきい値に達するまで待機し、ヒープは平準化の前にいくらか成長します。 – JimB

答えて

-2

調査してから、私は次のコードでそれを達成しました。

package main 

import (
    "time" 
) 

func main() { 
    c := make(chan bool) 
    timer := time.NewTimer(0) 
    for { 
     select { 
     case <-c: 
     default: 
      timer.Reset(time.Millisecond * 1) 
      <-timer.C 
     } 
    } 
} 
-1

あなたはselectを使用して、タイムアウトを実装し、から受け取ることができます。

select { 
    case res := <-c: 
    fmt.Println("do some work") 
    case <-time.After(time.Second * 1): 
    fmt.Println("timeout") 
} 

、あなたのプログラムは、あなたがプロファイリングを行うことができますメモリを利用しているかを理解したい場合。 Hereはこのトピックに関する素晴らしい記事です。

+0

'default:'を削除し、代わりに 'case <-time.After(time.Millisecond * 10):'を使用すると、時間の経過とともにmemの使用量が増えます。私はそれが時間pkgの内部のものだと思う。 – user3283107

関連する問題