以下のコードを実行すると、プログラムは約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
}
}
}
Time.Sleepは「メモリを増やしません」。メモリ消費量や使用量、実際に使用されているもの、いつ、どのようなメモリが解放され、OSに返されるかは非常に複雑です。 – Volker
時間を使用して.Timerはトリックをしました。私はあなたがそれが複雑だと言う時、あなたを信じています。 – user3283107
gctraceの出力を見て、GCが何をしているかを確認してください。スリープには小さな割り当てが必要で、最終的にはスリープする必要があります。本当の "仕事"をしているのであれば、おそらくいくつかの割り振りが必要になります。 GCは瞬間的ではなく、実行前にあるしきい値に達するまで待機し、ヒープは平準化の前にいくらか成長します。 – JimB