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

7

Vala生成的代码是否像正常手写的C代码一样优化?使用GObject系统是否会产生性能开销?

注意:在我的下一个C项目中,我正在研究是否使用Vala。这个项目不是GUI应用程序,而是一种解释器应用程序,必须在各种平台上运行。我使用gcc作为编译器。

4个回答

11
作为一名Vala开发者,我不建议在解释器中使用Vala。在解释器中,你需要创建许多对象来处理ast、数据类型、可能的中间对象、代码生成对象等等。在Vala本身中,我个人测试发现主要的开销是创建对象(这些对象只是简单的GTypeInstance,甚至不是GObject)。
Vala的设计是与GObject一起工作的,但是GObject并不适合快速分配。
因此,在您的项目中,我仍然会使用glib/gio进行跨平台开发,例如网络、字符串工具、unicode、数据结构等等,因为它们具有干净、一致和方便的API,但我不会将ast对象创建为gobjects/gtypeinstance。在解释器中,您需要快速分配,这才是重点。
我的个人建议是:如果您想构建桌面应用程序、dbus服务、gstreamer相关等与"g*"有关的内容,请使用Vala。其他情况下请不要使用。

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

1
我应该指出 Vala 和 C 在成本方面有一个不同的地方,那就是字符串:因为在 Vala 中,字符串上的 == 会导致 strcmp,这会稍微花费一些时间。不过,无论如何,在 C 中你也必须执行 strcmp;只是当你阅读代码时,它并不是显而易见的。 - apmasell

4

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

Aroop编译器生成的代码使用对象池,该池经过优化可用于对象的创建和操作。对象集合具有数据导向特性。例如,可以标记对象,并且可以在非常高效的遍历对象时选择标记,而且这些对象在内存位置方面都非常接近。

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


2
生成的代码永远不如手写的精细设计的代码优化,因为优化器无法了解设计目标。然而,优化器比人类程序员更一致地创建优化代码。同时,你应该定义你的目标,然后检查所选工具是否满足性能要求,而不是相反。优化不是设计目标,它是一个可能需要解决的任务,因此首先定义您的要求,然后考虑如何实现它。
过早的优化是万恶之源。 :)

我已经对需求有了大致的想法。该应用程序是一个简单的解释器,必须是平台无关的,并且可以快速执行大多数数学运算。现在,我的主要问题是使用GObject是否会产生任何性能开销。 - Anindya Chatterjee
如果您使用对象,总会涉及一些开销。如果您需要纯粹的性能,直接编写可能更好。当然,速度与可维护性之间总是存在权衡,而在您的情况下还有平台相关问题。不知道要求是什么,很难给出建议。还有一个问题是解释器被调用的频率。如果您不断加载进程来处理一些小数据集,则加载进程的开销很容易破坏代码中的任何性能优化。 - Devolus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接