<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Go:一個(gè)8bytes的內(nèi)存優(yōu)化

          共 2765字,需瀏覽 6分鐘

           ·

          2021-08-24 21:16

          最近看Dave Cheney 的一篇文章[1],發(fā)現(xiàn)一個(gè)有趣的代碼片段,里面提到了一個(gè) 8byte 的內(nèi)存優(yōu)化。

          代碼片段是這樣的:

          func BenchmarkSortStrings(b *testing.B) {
           s := []string{"heart""lungs""brain""kidneys""pancreas"}
           b.ReportAllocs()
           for i := 0; i < b.N; i++ {
            var ss sort.StringSlice = s
            var si sort.Interface = ss
            sort.Sort(si)
           }
          }

          代碼很簡(jiǎn)單,是對(duì)一個(gè)[]string做排序的內(nèi)存分配壓測(cè)

          其中

          var ss sort.StringSlice = s
          var si sort.Interface = ss
          sort.Sort(si)

          等同于代碼

          sort.Strings(s)

          涉及了對(duì) []string 轉(zhuǎn)換為實(shí)現(xiàn)排序的接口 sort.Interface

          了解iface實(shí)現(xiàn)的同學(xué)知道其data會(huì)存儲(chǔ)底層數(shù)據(jù),一般是一個(gè)機(jī)器字長(zhǎng)的大小(8bytes

          slice24bytes: 底層數(shù)組指針(8bytes)+ 長(zhǎng)度(8bytes)+ 容量(8bytes

          直接存不下,就只能indirection, 存指向切片的指針了

          創(chuàng)建前片指針的過程中,切片 escape 到了 heap 上,因?yàn)椴恢涝衅?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">ss是否會(huì)在si使用過程中消失。

          即,內(nèi)存分配發(fā)生在了這里!

          看下壓測(cè)結(jié)果(go1.16):

          go test sort_test.go -bench . -benchmem
          goos: darwin
          goarch: amd64
          cpu: Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
          BenchmarkInts-4         18846020                90.09 ns/op           24 B/op          1 allocs/op
          PASS
          ok      command-line-arguments  2.663s

          結(jié)果就是24bytes啊,那所謂的8bytes優(yōu)化在哪里呢

          是相對(duì)于的go1.16前版本的go的, 比如go1.15下:

          $ go1.15 test sort_test.go -bench . -benchmem
          goos: darwin
          goarch: amd64
          BenchmarkSortStrings-4           8617881               172 ns/op              32 B/op          1 allocs/op
          PASS
          ok      command-line-arguments  1.649s

          找了下具體提交,其實(shí)就是在內(nèi)存分配里針對(duì)三個(gè)機(jī)器字大小增加了24bytessizeClass,避免原來的向上取整到32bytes

          感興趣的同學(xué)可以去看看具體實(shí)現(xiàn):runtime: add 24 byte allocation size class[2]

          題外話,好久沒有更新了,不好意思了都,后邊再撿起來 ??

          參考資料

          [1]

          Dave Cheney的一篇文章: https://dave.cheney.net/2021/01/05/a-few-bytes-here-a-few-there-pretty-soon-youre-talking-real-memor

          [2]

          runtime: add 24 byte allocation size class: https://github.com/golang/go/commit/14c7caae5074fdf0d97a3ad995e20c63e4065cbf



          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù) ebook 獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。

          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品92内射 | 成人无码网站 | 日比视频在线观看 | 国产逼| 日产一区二区三区视频 |