Go語言 類型斷言效能測試

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

轉載自達達的部落格

在一些通用化的介面設計中,我們不得不用interface{}來代表任意類型,然後在介面內部用類型轉換來判斷具體類型,從而執行具體邏輯。但是類型判斷是有效能代價的,如果能具像化的知道這個效能代價有多大,就可以協助我們設計介面的時候判斷應該怎麼設計。

下面是實驗代碼(github):

package labs01import "testing"type InterfaceA interface {    AA()}type InterfaceB interface {    BB()}type A struct {    v int}func (a *A) AA() {    a.v += 1}type B struct {    v int}func (b *B) BB() {    b.v += 1}func TypeSwitch(v interface{}) {    switch v.(type) {    case InterfaceA:        v.(InterfaceA).AA()    case InterfaceB:        v.(InterfaceB).BB()    }}func NormalSwitch(a *A) {    a.AA()}func InterfaceSwitch(v interface{}) {    v.(InterfaceA).AA()}func Benchmark_TypeSwitch(b *testing.B) {    var a = new(A)    for i := 0; i < b.N; i++ {        TypeSwitch(a)    }}func Benchmark_NormalSwitch(b *testing.B) {    var a = new(A)    for i := 0; i < b.N; i++ {        NormalSwitch(a)    }}func Benchmark_InterfaceSwitch(b *testing.B) {    var a = new(A)    for i := 0; i < b.N; i++ {        InterfaceSwitch(a)    }}

執行結果:

dada-imac:misc dada$ go test -test.bench=".*" labs01testing: warning: no tests to runPASSBenchmark_TypeSwitch         50000000            33.0 ns/opBenchmark_NormalSwitch       2000000000          1.99 ns/opBenchmark_InterfaceSwitch    100000000           18.4 ns/opok      labs    7.741s

結論:類型判斷和類型轉換這兩個操作都比直接操作多幾倍的消耗。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.