Rumah >pembangunan bahagian belakang >Golang >Mengapa Fungsi Cgo Saya Jauh Lebih Lambat Daripada Fungsi Go Setara Saya?

Mengapa Fungsi Cgo Saya Jauh Lebih Lambat Daripada Fungsi Go Setara Saya?

DDD
DDDasal
2024-12-04 01:27:09806semak imbas

Why Is My Cgo Function So Much Slower Than My Equivalent Go Function?

Mengapa Prestasi Cgo Sangat Lambat: Memeriksa Kes Ujian

Dalam percubaan untuk membandingkan masa pelaksanaan Cgo dan fungsi Go tulen berulang kali, penguji menemui hasil yang tidak dijangka . Fungsi Cgo mengambil masa yang jauh lebih lama daripada fungsi Golang, yang membawa kepada kekeliruan dan penerokaan ke dalam kod ujian.

Kod Pengujian yang dipersoalkan

Kod ujian yang disediakan di bawah membandingkan masa pelaksanaan untuk Cgo dan fungsi Go tulen, setiap satunya dilaksanakan 100 juta kali:

import (
    "fmt"
    "time"
)

/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void show() {

}

*/
// #cgo LDFLAGS: -lstdc++
import "C"

//import "fmt"

func show() {

}

func main() {
    now := time.Now()
    for i := 0; i < 100000000; i = i + 1 {
        C.show()
    }
    end_time := time.Now()

    var dur_time time.Duration = end_time.Sub(now)
    var elapsed_min float64 = dur_time.Minutes()
    var elapsed_sec float64 = dur_time.Seconds()
    var elapsed_nano int64 = dur_time.Nanoseconds()
    fmt.Printf("cgo show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",
        elapsed_min, elapsed_sec, elapsed_nano)

    now = time.Now()
    for i := 0; i < 100000000; i = i + 1 {
        show()
    }
    end_time = time.Now()

    dur_time = end_time.Sub(now)
    elapsed_min = dur_time.Minutes()
    elapsed_sec = dur_time.Seconds()
    elapsed_nano = dur_time.Nanoseconds()
    fmt.Printf("go show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n",
        elapsed_min, elapsed_sec, elapsed_nano)

    var input string
    fmt.Scanln(&amp;input)
}

Hasil dan Pencarian Tidak Dijangka Jawapan

Keputusan yang diperoleh daripada kod ujian menunjukkan bahawa menggunakan fungsi C adalah lebih perlahan daripada fungsi Go. Ini membawa kepada persoalan sama ada terdapat sebarang kecacatan dalam kod ujian itu sendiri.

Menyelami Cabaran Prestasi Cgo

Walaupun kod ujian yang diberikan adalah sah, had prestasi yang wujud Cgo menyumbang kepada masa pelaksanaan yang lebih perlahan diperhatikan untuk fungsi Cgo.

Panggilan kod C/C melalui Cgo menimbulkan kod yang agak tinggi overhed, dan meminimumkan panggilan CGo ini biasanya disyorkan. Dalam senario khusus ini, mengalihkan gelung ke C dan bukannya berulang kali menggunakan fungsi CGo daripada Go berpotensi meningkatkan prestasi.

Selain itu, CGo menggunakan persediaan benang berasingan untuk melaksanakan kod C, membuat andaian tertentu tentang kod tingkah laku. Beberapa andaian ini boleh membawa kepada kesan prestasi:

  • Goroutines dalam Go menggunakan tindanan yang agak kecil dan mengendalikan pertumbuhan tindanan secara dinamik.
  • Pengendalian benang CGO boleh mengganggu pelaksanaan storan setempat benang libpthread.
  • Pengendali isyarat UNIX Go mungkin mengganggu C atau C tradisional kod.
  • Menggunakan semula urutan OS untuk berbilang Goroutine mungkin mempunyai akibat negatif jika kod C terlibat dalam menyekat panggilan sistem atau memonopoli urutan.

Kesimpulan

Peranan CGO sepatutnya dilihat terutamanya sebagai pintu masuk ke antara muka dengan perpustakaan sedia ada, berpotensi dengan tambahan fungsi pembalut C kecil untuk mengurangkan bilangan panggilan dibuat daripada Go. Jangkaan pengoptimuman prestasi seperti C melalui CGo biasanya tidak dipenuhi, kerana jurang prestasi sudah berkurangan antara kod C dan Go yang setara.

Atas ialah kandungan terperinci Mengapa Fungsi Cgo Saya Jauh Lebih Lambat Daripada Fungsi Go Setara Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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