在GO应用程序中使用C( )进行性能
Using C(++) in a Go application for performance
我已经开始学习了几天前,并由其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风格的组件中写入一些math
和big
包。
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功能调用的开销令人震惊。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 在GO应用程序中使用C( )进行性能
- 矢量性能在Go和c++
- 在 Go 方法中按值传递"this"是否会对性能造成损失?