Warum ist die Leistung von cgo so langsam? Stimmt etwas mit meinem Testcode nicht?

Lesezeit: 2 Minuten

Benutzer-Avatar
习明昊

Ich mache einen Test: Vergleichen Sie die Ausführungszeiten von cgo- und reinen Go-Funktionen, die jeweils 100 Millionen Mal ausgeführt werden. Die cgo-Funktion dauert im Vergleich zur Golang-Funktion länger, und ich bin mit diesem Ergebnis verwirrt. Mein Testcode ist:

package main

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(&input)
}

und Ergebnis ist:

cgo show function elasped 0.368096 minutes or 
elapsed 22.085756 seconds or 
elapsed 22085755775 nanoseconds

go show function elasped 0.000654 minutes or 
elapsed 0.039257 seconds or 
elapsed 39257120 nanoseconds

Die Ergebnisse zeigen, dass das Aufrufen der C-Funktion langsamer ist als die Go-Funktion. Stimmt etwas mit meinem Testcode nicht?

Mein System ist: Mac OS X 10.9.4 (13E28)

  • Warum sollte das Aufrufen einer C-Funktion aus Go Ihrer Meinung nach schneller sein als das Aufrufen einer Go-Funktion aus Go?

    – Volker

    2. Februar 2015 um 6:54 Uhr

  • Ich würde erwarten, dass der Go-Code die Go-Version von integriert show() das ist ein weiterer Vorteil gegenüber dem Go-Code C.show().

    – Nick Craig-Wood

    2. Februar 2015 um 19:34 Uhr

  • Dies ist etwas veraltet, aber der Leistungstreffer, den die akzeptierte Antwort beschreibt, ist immer noch vorhanden, und zwar zu ungefähr den gleichen (konstanten) Kosten. Der Grund, warum das Beispiel in der Frage die Kosten übertrieben hat – viel! – liegt daran, dass die betreffende Funktion inliniert wird. Es ist kein Vergleich von Äpfeln zu Äpfeln.

    – Bad Zen

    7. Juni 2021 um 3:55 Uhr

1258020cookie-checkWarum ist die Leistung von cgo so langsam? Stimmt etwas mit meinem Testcode nicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy