Vala生成的C代码优于手写C代码有多少优化?

时间:2013-06-12 05:37:33

标签: c gcc vala gobject

Vala生成的代码是否像普通的手写C代码一样进行了优化?使用GObject系统而不使用它会有任何性能开销吗?

注意:在我的下一个C项目中,我正在研究是否使用Vala。该项目不是GUI应用程序,它是一种解释器类型的应用程序,必须与平台无关。我使用gcc作为编译器。

4 个答案:

答案 0 :(得分:10)

作为Vala开发人员,我不建议使用Vala作为翻译。在解释器中,您将为ast,数据类型,可能的中间对象,codegen对象等创建许多对象。在Vala本身,我个人测量了主要的开销是创建对象(简单的GTypeInstance,甚至不是GObject)。 Vala旨在与gobjects一起使用,但gobjects并不是为快速分配而设计的。

所以,对于你的项目,我仍然会使用glib / gio来处理跨平台的东西,比如网络,字符串工具,unicode,数据结构等,因为它们有一个干净,一致和方便的API,但我不会像gobjects / gtypeinstance那样创建ast对象。 在翻译中你需要快速分配,这就是重点。

我的个人建议是:如果您想构建桌面应用程序,dbus服务,gstreamer内容或任何触及g *世界的东西,请使用vala,

答案 1 :(得分:5)

这取决于你写作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来限制它们的创建。

答案 2 :(得分:2)

生成的代码永远不会像精心设计的手写代码那样优化,因为优化器无法知道设计目标。但是,优化器会比人类程序员更加一致地创建优化代码。您还应该定义目标,然后检查所选工具是否满足性能要求,而不是相反。优化不是设计目标,这是一项可能需要解决的任务,因此首先要定义您的需求,然后考虑如何实现它。

过早优化是万恶之源。 :)

答案 3 :(得分:2)

vala编译器生成的代码使用GObject库。如果需要避免使用GObject,我建议使用aroop编译器使用vala解析器来解析vala代码,但不会在生成的代码中使用GObject。

Aroop编译器生成使用对象池的代码,该对象池针对对象创建和操作进行了优化。对象集合具有面向数据的特征。例如,可以标记对象,并且可以在以非常有效的方式遍历对象的同时选择标记,并且对象在存储器位置的透视图中都是近距离的。

aroop编译器用于编写shotodol项目,该项目没有自己的GUI。它有模块和插件系统。它有一个命令行界面,使人们可以编写服务器应用程序。使用shotodol的服务器应用程序示例在此处为shotodol_web。我希望喜欢这个项目的人在project page中分享他们的问题。