Sto facendo un test: confronta i tempi di esecuzione di cgo e le funzioni di puro Go eseguono 100 milioni di volte ciascuna. La funzione cgo impiega più tempo rispetto alla funzione Golang e sono confuso da questo risultato. Il mio codice di prova è:Perché le prestazioni di cgo sono così lente? c'è qualcosa di sbagliato nel mio codice di test?
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)
}
e il risultato è il seguente:
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
I risultati mostrano che invocando la funzione C è più lenta rispetto alla funzione Go. C'è qualcosa di sbagliato nel mio codice di test?
Il mio sistema è: Mac OS X 10.9.4 (13E28)
Perché pensi che chiamare una funzione C da Go dovrebbe essere più veloce di chiamare una funzione Go da Go? – Volker
Mi aspetto che il go code incorpori la versione go di 'show()' che è un ulteriore vantaggio del codice go su 'C.show()'. –