Vala 生成的 C 代码比手写的 C 代码优化了多少?
Posted
技术标签:
【中文标题】Vala 生成的 C 代码比手写的 C 代码优化了多少?【英文标题】:How much optimized is Vala generated C code over hand written C code? 【发布时间】:2013-06-08 03:24:51 【问题描述】:Vala 生成的代码是否像普通的手写 C 代码一样进行了优化?使用 GObject 系统是否比不使用它有任何性能开销?
注意:在我的下一个 C 项目中,我正在研究是否使用 Vala。该项目不是 GUI 应用程序,它是一种解释器类型的应用程序,必须独立于平台。我使用 gcc 作为编译器。
【问题讨论】:
【参考方案1】:作为 Vala 开发人员,我不建议将 Vala 用作解释器。在解释器中,您将为 ast、数据类型、可能的中间对象、代码生成对象等创建许多对象。在 Vala 本身中,我个人测量了主要开销是创建对象(即简单的 GTypeInstance,甚至不是 GObject)。 Vala 旨在与 gobject 一起使用,但 gobject 并非旨在快速分配。
所以,对于你的项目,我仍然会使用 glib/gio 来处理跨平台的东西,比如网络、字符串工具、unicode、数据结构等等,因为它们有一个干净、一致和方便的 API,但我不会将 ast 对象创建为 gobjects/gtypeinstance。 在解释器中,您希望快速分配,这就是重点。
我的个人建议是:如果你想构建桌面应用程序、dbus 服务、gstreamer 东西或任何触及 g* 世界的东西,就使用 vala。
【讨论】:
【参考方案2】:这取决于你会写什么 C。特别是:
既然我可以手写基于 GObject 的 C 代码,你的门槛是多少?手写的基于 GObject 的 C 与 Vala 编写的基于 GObject 的 C?可能具有可比性,因为 Vala 将生成或多或少与人类相同的库调用。 GObject 类在技术上是可选的。您可以将一个类标记为[Compact]
以跳过一个类的所有 GLib 代码生成,这会更快,尽管这样做会丢失许多特性,例如虚拟方法。这仍然会比用 C 编写的对象稍微多一些开销,但它带有线程安全的引用计数和一些典型的 C 程序员不会费心去做的其他事情。
Vala 会生成大量临时变量。如果你的 C 编译器有优化,这些临时的大部分都将被淘汰。 Vala 的大部分控制结构与其 C 对应部件相匹配,因此 Vala if
不会比 C if
贵得惊人。
Vala 在编译时跟踪引用以进行内存管理。通常,这很便宜,但它会导致数组和字符串的额外重复。特别是,如果你将一个无主的字符串复制到一个拥有的变量中,strdup
将被自动调用。这意味着生成的 Vala 将创建更多这些小的临时对象,但是,如果确实有问题,您可以明智地使用 unowned
来限制它们的创建。
【讨论】:
我应该指出 Vala 和 C 在成本方面不同的一个地方是字符串:由于在 Vala 中字符串上的==
导致 strcmp
,因此它的成本会更高一些。再说一次,无论如何你都必须在 C 中使用strcmp
;当您阅读代码时,这并不是很明显。【参考方案3】:
vala 编译器生成的代码使用 GObject 库。如果需要避免GObject,我建议使用aroop编译器,它使用vala解析器来解析vala代码,但在生成的代码中不使用GObject。
Aroop 编译器生成使用对象池的代码,该对象池针对对象创建和操作进行了优化。对象的集合具有面向数据的特征。例如,可以标记对象,并且可以在以非常有效的方式遍历对象时选择标记,并且从内存位置的角度来看,对象都在近距离。
aroop 编译器用于编写没有自己的 GUI 的shotodol 项目。它有模块和插件系统。它有一个命令行界面,使人们能够编写服务器应用程序。使用shotodol 的服务器应用程序示例在此处作为shotodol_web 存在。我希望喜欢这个项目的人在project page 中分享他们的问题。
【讨论】:
【参考方案4】:生成的代码永远不会像精心设计的手写代码那样优化,因为优化器无法知道设计目标。然而,优化器比人类程序员更一致地创建优化代码。此外,您应该定义您的目标,然后检查所选工具是否满足性能要求,而不是相反。优化不是设计目标,它是一项可能需要解决的任务,因此首先定义您的需求,然后考虑如何实现它。
过早的优化是万恶之源。 :)
【讨论】:
我已经对需求有了大致的了解。该应用程序是一个简单的解释器,它必须独立于平台,并且可以主要对数学运算进行快速解释。现在使用 GObject 是否会产生任何性能开销是我在这个问题中主要关心的问题。 如果你使用对象,总会有开销。如果您需要纯粹的性能,直接编写它可能会更好。当然,总是需要权衡速度与可维护性,在您的情况下,还有平台相关问题。不知道要求很难给出推荐。还有一个问题是多久调用一次口译员。如果你不断地加载一个进程来处理一些小数据集,加载进程的开销很容易破坏代码中的任何性能优化。 问题不在于“精心设计的手写汇编代码”;这是关于 Vala 与 C。Vala 生成 C,它不是汇编语言。以上是关于Vala 生成的 C 代码比手写的 C 代码优化了多少?的主要内容,如果未能解决你的问题,请参考以下文章
C语言之迷宫小游戏2.0版(随机生成地图,可变颜色,优化游戏体验)
C语言之迷宫小游戏2.0版(随机生成地图,可变颜色,优化游戏体验)