为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?

为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?,第1张

概述我正在做一个测试:比较cgo和pure Go功能的卓越时间每次运行1亿次.与Golang功能相比,cgo功能需要更长的时间,我对此结果感到困惑.我的测试代码是: package mainimport ( "fmt" "time")/*#include <stdio.h>#include <stdlib.h>#include <string.h>void show 我正在做一个测试:比较cgo和pure Go功能的卓越时间每次运行1亿次.与Golang功能相比,cgo功能需要更长的时间,我对此结果感到困惑.我的测试代码是:
package mainimport (    "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_nano)    var input string    fmt.Scanln(&input)}

结果是:

cgo show function elasped 0.368096 minutes or elapsed 22.085756 seconds or elapsed 22085755775 nanosecondsgo show function elasped 0.000654 minutes or elapsed 0.039257 seconds or elapsed 39257120 nanoseconds

结果表明,调用C函数比Go函数慢.我的测试代码有什么问题吗?

我的系统是:mac OS X 10.9.4(13E28)

解决方法 正如你所发现的,通过CGo调用C/C++代码有相当高的开销.因此,一般来说,您最好尽量减少您所做的CGo电话数量.对于上述示例,而不是在循环中重复调用CGo功能,将循环向下移动到C可能是有意义的.

有几个方面,Go运行时如何设置线程,可以打破许多C代码的期望:

> Goroutines运行在相对较小的堆栈中,通过分段堆栈(旧版本)或复制(新版本)来处理堆栈增长.
由Go运行时创建的线程可能无法与libpthread的线程本地存储实现正常交互.
> Go运行时的UNIX信号处理程序可能会干扰传统的C或C代码.
去重用 *** 作系统线程来运行多个Goroutines.如果C代码称为阻塞系统调用或以其他方式垄断线程,则可能对其他goroutine有害.

由于这些原因,CGo选择了使用传统堆栈设置的单独线程运行C代码的安全方法.

如果您来自像Python这样的语言,那么在C中重写代码热点并不罕见,以加快程序速度,您将失望.但同时,等效的C和Go代码之间的性能差距要小得多.

一般来说,我保留CGo与现有库进行连接,可能使用小的C包装函数,可以减少从Go所需的调用次数.

总结

以上是内存溢出为你收集整理的为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?全部内容,希望文章能够帮你解决为什么cgo的表现如此缓慢?我的测试代码有什么问题吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1235529.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存