@@ -151,37 +151,37 @@ import "testing"
151151var x = make([][]int, 100)
152152
153153func init() {
154- for i := 0; i < 100; i++ {
155- x[i] = make([]int, 100)
156- }
154+ for i := 0; i < 100; i++ {
155+ x[i] = make([]int, 100)
156+ }
157157}
158158
159159func traverseVertical() {
160- for i := 0; i < 100; i++ {
161- for j := 0; j < 100; j++ {
162- x[j][i] = 1
163- }
164- }
160+ for i := 0; i < 100; i++ {
161+ for j := 0; j < 100; j++ {
162+ x[j][i] = 1
163+ }
164+ }
165165}
166166
167167func traverseHorizontal() {
168- for i := 0; i < 100; i++ {
169- for j := 0; j < 100; j++ {
170- x[i][j] = 1
171- }
172- }
168+ for i := 0; i < 100; i++ {
169+ for j := 0; j < 100; j++ {
170+ x[i][j] = 1
171+ }
172+ }
173173}
174174
175175func BenchmarkHorizontal(b *testing.B) {
176- for i := 0; i < b.N; i++ {
177- traverseHorizontal()
178- }
176+ for i := 0; i < b.N; i++ {
177+ traverseHorizontal()
178+ }
179179}
180180
181181func BenchmarkVertical(b *testing.B) {
182- for i := 0; i < b.N; i++ {
183- traverseVertical()
184- }
182+ for i := 0; i < b.N; i++ {
183+ traverseVertical()
184+ }
185185}
186186
187187```
@@ -277,6 +277,14 @@ sync.Pool 用出花儿的就是 fasthttp 了,可以看看我之前写的这一
277277
278278最简单的复用就是复用各种 struct,slice,在复用时 put 时,需要 size 是否已经扩容过头,小心因为 sync.Pool 中存了大量的巨型对象导致进程占用了大量内存。
279279
280+ #### 修改 GOGC
281+
282+ 当前有 memory ballast 和动态 GOGC 两种方案:
283+ 1 . [ memory ballast] ( https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/ )
284+ 2 . [ GOGCTuner] ( https://github.com/cch123/gogctuner )
285+
286+ 后者可以根据 gc cycle 动态调整 GOGC,使应用占用的内存水位始终保持在 70%,既不 OOM,又能合理利用内存空间来降低 GC 触发频率。
287+
280288### 调度占用过多 CPU
281289
282290goroutine 频繁创建与销毁会给调度造成较大的负担,如果我们发现 CPU 火焰图中 schedule,findrunnable 占用了大量 CPU,那么可以考虑使用开源的 workerpool 来进行改进,比较典型的 [ fasthttp worker pool] ( https://github.com/valyala/fasthttp/blob/master/workerpool.go#L19 ) 。
0 commit comments