在GO应用程序中使用C( )进行性能

Using C(++) in a Go application for performance

本文关键字:性能 GO 应用程序      更新时间:2023-10-16

我已经开始学习了几天前,并由其CGO Thing和GCCGO编译器出现。从我的理解来看,这允许GO程序使用GO编译器编译并使用C编译器编译C库,并从GO内部的GO内部参考这些库。这对我来说真的很有趣,因为这使我们能够从没有开销的主要程序中利用C的性能(如果需要)。

但是,我不确定这一点,所以我在这里问:

是否有情况创建一个C库只是为了从GO内部使用它?还是此功能仅是为了促进现有C代码的可重复使用?

P.S:我认为目前CGO不支持C ,但是这里有一个能够使用C函数包装C 代码并成功称呼它们的帖子。

CGO相当慢,因为Go必须弄乱其运行时并以某些方式调用约定来调用C函数。唯一值得的地方是,计算时间大幅相形见war。它类似于平行,分布式,GPU等,尽管启动成本略低。

组件要好得多,因为您可以编写使用GO呼叫惯例的汇编,否则可以像本地GO代码一样对待,但是汇编的便携程度要差得多,更难读取,并且维护更大。实际上,GO标准库在计划9风格的组件中写入一些mathbig包。

gonum是这两者的一个例子。它使用常见的组件来以某种方式更快地完成一些功能,但它还利用了大键和拉帕克引擎。它确实提供了Go-blas实现,但是C-Blas(通常最终是Fortran-Blas)更快,对于大型矩阵计算,几乎总是使离开的成本相形见war。

通常,您希望在可能的情况下避免CGO。仅在需要大量的计算时间时使用它,您需要与在纯GO中进行互动的事物进行交互。即使那样,如果您真的很关心性能,那么在可能的情况下,实现某种"调用池"可能是值得的,您可以在其中安排多个呼叫,并立即通过单个上下文切换到C。

编辑:至于C ,存在一些重大问题。没有几层抽象的情况下,很难包装某些库(因为CGO无法正确处理包含的C 标头)。此外,带有破坏者的C 类无法真正通过价值返回,必须在堆上分配。由于GO不允许确定资源的确定性确定,因此您必须提供一个明确免费内存的函数,并且GO用户必须记住以释放资源。(您可以在名为runtime.SetFinalizer的文档中阅读一个函数,但我不能说我见过有人使用它,并且文档本身带有一堆警告)

诸如defer之类的功能使它更易于管理,但是它破坏了许多使现代C 实践更安全的事情。

,除非一个c库在一个呼叫中进行大量工作,否则我不会为性能编写C代码。我认为CGO仅用于与旧代码接口。

原因是CGO开销。当前,在CGO函数中函数调用的速度速度慢了50至100倍,速度速度比go Code的功能调用速度慢了50到100倍。CGO功能调用的开销令人震惊。