• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            測試用例

            我們對Golang的結構體變量賦值, 以及單參數函數調用進行反射和native操作的測試

             

            package main

             

            import (

            "reflect"

            "testing"

            )

             

            type data struct {

            Hp int

            }

             

            const AssignTimes = 100000000

             

            func TestNativeAssign(t *testing.T) {

             

            v := data{Hp: 2}

             

            for i := 0; i < AssignTimes; i++ {

            v.Hp = 3

            }

             

            }

             

            func TestReflectAssign(t *testing.T) {

             

            v := data{Hp: 2}

             

            vv := reflect.ValueOf(&v).Elem()

             

            f := vv.FieldByName("Hp")

             

            for i := 0; i < AssignTimes; i++ {

             

            f.SetInt(3)

            }

             

            }

             

            func TestReflectFindFieldAndAssign(t *testing.T) {

             

            v := data{Hp: 2}

             

            vv := reflect.ValueOf(&v).Elem()

             

            for i := 0; i < AssignTimes; i++ {

             

            vv.FieldByName("Hp").SetInt(3)

            }

             

            }

             

            func foo(v int) {

             

            }

             

            const CallTimes = 100000000

             

            func TestNativeCall(t *testing.T) {

            for i := 0; i < CallTimes; i++ {

             

            foo(i)

            }

            }

             

            func TestReflectCall(t *testing.T) {

             

            v := reflect.ValueOf(foo)

             

            for i := 0; i < CallTimes; i++ {

             

            v.Call([]reflect.Value{reflect.ValueOf(2)})

            }

            }

            性能測試數據

            === RUN TestNativeAssign
            — PASS: TestNativeAssign (0.03s)
            === RUN TestReflectAssign
            — PASS: TestReflectAssign (0.41s)
            === RUN TestReflectFindFieldAndAssign
            — PASS: TestReflectFindFieldAndAssign (9.86s)
            === RUN TestNativeCall
            — PASS: TestNativeCall (0.03s)
            === RUN TestReflectCall
            — PASS: TestReflectCall (21.46s)

            測試評測

            • 在結構體變量賦值測試用例中, 我們發現TestReflectFindFieldAndAssign賦值格外的耗時. 分析性能點在FieldByName這個函數上, 我們查了下底層如何實現的:

            // FieldByName returns the struct field with the given name

            // and a boolean to indicate if the field was found.

            func (t *structType) FieldByName(name string) (f StructField, present bool) {

            // Quick check for top-level name, or struct without anonymous fields.

            hasAnon := false

            if name != "" {

            for i := range t.fields {

            tf := &t.fields[i]

            if tf.name == nil {

            hasAnon = true

            continue

            }

            if *tf.name == name {

            return t.Field(i), true

            }

            }

            }

            if !hasAnon {

            return

            }

            return t.FieldByNameFunc(func(s string) bool { return s == name })

            }

            各位看官必須吐槽用for來遍歷獲取數據, 但冷靜下來分析. 這樣做無可厚非.
            試想如果reflect包在我們使用ValueOf時使用map緩沖好一個結構體所有字段的訪問數據后, 肯定訪問指定字段速度會很快
            但是, 以空間換速度的需求其實最多滿足了1%的需求.
            同樣的例子是圖形API里訪問Shader變量的方法, 總是默認使用字符串獲取, 速度很慢. 當你想快速訪問時, 請提前按需緩存字段
            那么, Golang使用的也是這樣的思路. 雖然暴力了一點, 但是能夠讓程序跑對, 性能優化的東西放在之后來做, 緩沖下就可以解決

            • 在調用測試用例中, 毫無懸念的, 調用速度很慢
              因此, 我們在平時使用反射時, 盡量偏向于反射變量緩沖存在下的變量賦值或者獲取
              而調用的需求盡量減少, 如果有goroutine存在的情況下, 則不必太多擔心.
            posted on 2016-08-12 15:26 戰魂小筑 閱讀(3040) 評論(0)  編輯 收藏 引用 所屬分類: 網絡 服務器技術Golang
            久久亚洲精品成人无码网站| 嫩草影院久久国产精品| 久久亚洲综合色一区二区三区| 无码国内精品久久人妻蜜桃| 97久久综合精品久久久综合| 国产精品女同一区二区久久| 四虎久久影院| 久久久av波多野一区二区| 久久国产成人午夜aⅴ影院| 久久久久久久久久久| 精品国产青草久久久久福利| 69久久精品无码一区二区| 日韩欧美亚洲综合久久影院d3| 亚洲国产一成久久精品国产成人综合 | 无码超乳爆乳中文字幕久久| 国产精品9999久久久久| 久久久精品人妻一区二区三区蜜桃| 精品综合久久久久久98| 久久99精品综合国产首页| 少妇久久久久久被弄高潮| 精品国产热久久久福利| 2022年国产精品久久久久 | 亚洲第一极品精品无码久久| 亚洲天堂久久精品| 欧美777精品久久久久网| 久久午夜无码鲁丝片秋霞| 精品免费久久久久国产一区| 国产精品99精品久久免费| 日韩乱码人妻无码中文字幕久久 | 久久精品国产亚洲AV无码娇色| 日韩亚洲国产综合久久久| 国产AV影片久久久久久| 情人伊人久久综合亚洲| 久久水蜜桃亚洲av无码精品麻豆| 久久婷婷五月综合国产尤物app| 蜜臀久久99精品久久久久久| 一级A毛片免费观看久久精品| 91亚洲国产成人久久精品| 亚洲欧美日韩精品久久| 精品无码人妻久久久久久| 精品久久久久久无码中文字幕 |