c – 在GoLang应用程序中使用C()来提高性能

前端之家收集整理的这篇文章主要介绍了c – 在GoLang应用程序中使用C()来提高性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我几天前就开始研究Go了,它来自CGO的东西和 gccgo编译器.根据我的理解,这允许使用Go编译器编译Go程序并使用C编译器编译C库并从Go程序内引用这些库.这对我来说非常有趣,因为这使我们可以从主程序中利用C的性能(如果需要),而且开销很小.

但是我不确定那是多么的少,所以我在这里问:

是否有创建C库的情况只是为了在Go应用程序中使用它?或者此功能仅用于促进现有C代码的可重用性?

P.S:我认为目前CGO不支持C,但是有人发表了一篇能够使用C函数包装C代码并成功调用它们的帖子.

解决方法

Cgo相当慢,因为Go在某些方面必须以 mess with its runtime and calling conventions调用C函数.它真正值得的唯一地方是计算时间与 this cost相比相形见绌的情况.它类似于并行,分布式,GPU等编程,尽管启动成本略低.

汇编要好得多,因为你可以编写使用Go的调用约定的汇编,并且在其他方​​面被视为本机Go代码,但汇编不那么便携,难以阅读,维护更多.事实上,Go标准库在Plan 9风格的程序集中编写了一些数学和大包.

Gonum是这两者的一个例子.它使用通用程序集来实现某些功能,可以通过这种方式更快地完成,但它也可以利用blas和lapack引擎.它确实提供了Go-blas实现,但C-blas(通常最终是Fortran-blas)更快,而对于大型矩阵计算,几乎总是使离开Go的成本相形见绌.

通常,您希望尽可能避免使用cgo.仅在需要大量计算时间时使用它,或者您需要与纯Go中交互的内容(如图形或音频驱动程序)或访问OpenCV等公共库进行交互.即使这样,如果你真的关心性能,在可能的情况下实现某种“调用池”可能是值得的,你可以从Go端调度多个调用,并通过单个上下文切换到C一次执行它们.

编辑:至于C,有一些重大问题.如果没有多层抽象,可能很难包装某些库(因为cgo无法正确处理包含的C头).另外,带有析构函数的C类实际上不能按值返回,必须在堆上进行分配.由于Go不允许确定性地完成资源,因此必须提供显式释放内存的功能,并且Go用户必须记住释放资源. (你可以在名为runtime.SetFinalizer的文档中看到一个函数,但我不能说我见过有人使用它,文档本身带有一堆警告)

像延迟这样的功能使得它更易于管理,但它破坏了许多像RAII这样使现代C语言更安全的东西.

猜你在找的C&C++相关文章