Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Penegasan Jenis dan Suis Jenis Berprestasi Berbanding dengan Metodologi Semakan Jenis Lain?

Bagaimanakah Penegasan Jenis dan Suis Jenis Berprestasi Berbanding dengan Metodologi Semakan Jenis Lain?

Mary-Kate Olsen
Lepaskan: 2024-12-01 07:47:10
asal
330 orang telah melayarinya

How Do Go's Type Assertions and Type Switches Perform Compared to Other Type-Checking Methodologies?

Taip Penegasan dan Prestasi Suis dalam Go

Dalam bahasa pengaturcaraan, menentukan jenis pembolehubah atau objek semasa masa jalan ialah operasi asas. Go menggunakan penegasan jenis dan suis jenis untuk memudahkan proses ini. Artikel ini menyelidiki ciri prestasi teknik ini.

Kebimbangan Prestasi

Dalam sesetengah bahasa seperti C/C , penemuan jenis masa jalan boleh dikenakan penalti prestasi. Pengaturcara Go telah memikirkan sama ada penegasan jenis atau suis jenis menunjukkan ketidakcekapan yang sama. Untuk menangani perkara ini, mari kita lakukan penanda aras komprehensif:

package main

import (
    "fmt"
    "testing"
)

func question(anything interface{}) {
    switch v := anything.(type) {
        case string:
            fmt.Println(v)
        case int32, int64:
            fmt.Println(v)
        case SomeCustomType:
            fmt.Println(v)
        default:
            fmt.Println("unknown")
    }
}
Salin selepas log masuk

Kod sampel menggunakan suis jenis untuk menentukan jenis pembolehubah input apa-apa.

Perbandingan Penanda Aras

Satu siri ujian penanda aras telah dijalankan untuk membandingkan prestasi penegasan jenis dan suis dengan panggilan kaedah langsung dan antara muka pelaksanaan:

package main

import (
    "testing"
)

type myint int64

type Inccer interface {
    inc()
}

func (i *myint) inc() {
    *i = *i + 1
}

func BenchmarkIntmethod(b *testing.B) {
    i := new(myint)
    incnIntmethod(i, b.N)
}

func BenchmarkInterface(b *testing.B) {
    i := new(myint)
    incnInterface(i, b.N)
}

func BenchmarkTypeSwitch(b *testing.B) {
    i := new(myint)
    incnSwitch(i, b.N)
}

func BenchmarkTypeAssertion(b *testing.B) {
    i := new(myint)
    incnAssertion(i, b.N)
}

func incnIntmethod(i *myint, n int) {
    for k := 0; k < n; k++ {
        i.inc()
    }
}

func incnInterface(any Inccer, n int) {
    for k := 0; k < n; k++ {
        any.inc()
    }
}

func incnSwitch(any Inccer, n int) {
    for k := 0; k < n; k++ {
        switch v := any.(type) {
        case *myint:
            v.inc()
        }
    }
}

func incnAssertion(any Inccer, n int) {
    for k := 0; k < n; k++ {
        if newint, ok := any.(*myint); ok {
            newint.inc()
        }
    }
}
Salin selepas log masuk

Pada berbilang mesin ujian, keputusan secara konsisten mendedahkan bahawa keempat-empat kaedah berfungsi pada kelajuan yang sama: panggilan kaedah langsung, pelaksanaan antara muka, penegasan jenis dan suis jenis. Contoh berikut menunjukkan penemuan ini:

BenchmarkIntmethod-16           2000000000           1.67 ns/op
BenchmarkInterface-16           1000000000           2.03 ns/op
BenchmarkTypeSwitch-16          2000000000           1.70 ns/op
BenchmarkTypeAssertion-16       2000000000           1.67 ns/op
Salin selepas log masuk

Oleh itu, kesimpulan kami ialah penegasan jenis dan suis jenis dalam Go tidak mengalami kemerosotan prestasi yang ketara jika dibandingkan dengan metodologi semakan jenis lain.

Atas ialah kandungan terperinci Bagaimanakah Penegasan Jenis dan Suis Jenis Berprestasi Berbanding dengan Metodologi Semakan Jenis Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan