轻量级C ++脚本库

时间:2009-05-27 13:41:52

标签: c++ qt scripting

我目前在我的C ++应用程序中使用QtScript来编写脚本功能,但它在cpu上相当“重”。当线程评估循环中的所有脚本时,cpu使用率增加到90%-100%。即使我每5个脚本让它睡眠1毫秒,它仍然高于75%的CPU使用率。

还有其他易于实现的脚本框架比QScript轻得多吗?

修改

我现在意识到这是正常的行为,而不是QtScript中的一些麻烦。听听哪种(轻量级)脚本库可用仍然很有趣。

9 个答案:

答案 0 :(得分:16)

看看Lua,它经常在游戏中使用,所以性能必须非常好。

答案 1 :(得分:12)

那么,你期待什么?除非脚本必须等待磁盘或用户I / O,否则CPU 以100%运行。

你的问题是它运行得很久吗?

或者您的应用程序没有响应?

在这种情况下,问题是您的脚本阻塞了运行所有UI交互的线程。一般的解决方案是阻止所有UI输入(“取消脚本”按钮:)除外,并将实际处理移动到单独的线程。

<强> [编辑]
略有不同的问题:CPU是否处于100%而没有要处理的脚本?

如果您正在处理某些事情,100%的CPU是健康的。

CPU始终处于忙碌状态,当前线程始终占用正在运行的核心的100%。 “0%CPU活动”实际上意味着所有周期都花费在系统空闲线程中(属于您在任务管理器中看到的“系统空闲进程”)。

作为一个简单的示例:如果您有一个应用程序线程处于活动状态,并且CPU使用率为40%,并且您的任务管理器更新间隔为1秒,则在应用程序上花费400毫秒的CPU时间,在空闲线程上花费600毫秒。

答案 2 :(得分:3)

Lua很好,因为它使用堆栈在解释器和C ++之间进行通信。这很好,因为它不涉及任何可见的引用计数,这简化了事情。

这是一个有趣的比较作为一些iolanguage的背景:iolanguage

答案 3 :(得分:2)

我听说过有关TinyScheme的好消息。话虽如此,我们在这里使用Lua(在游戏开发工作室,针对嵌入式和手持式系统)。

值得注意的是 - 特别是Lua,但我认为这些适用于许多这些语言:

  • 自定义轻量级小对象分配器可以获得很多性能;许多这些语言都很重要。使用池或基于帧的分配器可能值得您花时间,具体取决于您可以使用的内容。
  • 根据所使用的GC策略(因为大多数这些语言都是垃圾回收),您需要保持GC扫描区域较小 - 例如一个小的lua堆大小整体。花一些时间重新组织数据以使其超出GC的域(例如保持C ++方面,以某种方式标记它以便GC知道避免它等)可以提供帮助。
  • 同样,增量垃圾收集可能是一个巨大的胜利。我建议尝试 - 在某些情况下(小堆)我发现完整的GC比增量更快。

答案 4 :(得分:2)

我个人会建议Lua在我们的嵌入式平台中广泛使用它。如果您在Windows上运行,您可以使用像LuaJIT这样的东西来让您的Lua更快

但是,由于没有人提及它,你可能还想看看Squirrel(http://squirrel-lang.org/)。我没有任何经验,但我认为它看起来很有希望。

对于您当前的问题,如果没有任何阻止它的内容,任何代码都会占用100%的CPU。

类似(伪代码):

有(ⅰ= 1,10000000000000)   N = N + I 结束

将占用100%的CPU,直到它(几乎)以任何语言完成,因为没有什么可以阻止它执行。

答案 5 :(得分:1)

这实际上取决于几个因素:

  • 您的应用程序中是否会使用大量脚本?
  • 脚本会复杂吗?
  • 您是否向脚本引擎公开了很多功能?
  • 你是否关心与Qt的良好整合?

我也推荐Lua,但是,你应该记住以下几点:Lua是用纯ANSI C实现的。这使得它非常便携,但是如果你在C ++环境中开发,它会导致很多“包装”类。特别是当您想要公开Qt功能(包括所有SIGNALSLOTPROPERTY s)时,会导致大量重复的代码。

答案 6 :(得分:1)

Lua是您的language of choice。有一些bindings for Qt

答案 7 :(得分:0)

您还可以使用spidermonkey嵌入javascript 我认为javascript比lua更广泛。

答案 8 :(得分:0)

到目前为止,QtScript没有任何问题(仅从4.6开始使用它,所以仍然是新的,但到目前为止还喜欢它)。取决于你如何使用它,就像lua或python一样。如果您保留应用程序的核心功能本机(从c / c ++编译)并且只向脚本引擎公开一个最小的API,那么通常情况下,您可以保持活泼。

使用QtScript,以合理的线程安全方式(QT的插槽和信号对象模型)公开对象及其方法相对容易,并且可以轻松地将脚本创建的对象传递给本机函数......但是最终可能会紧密集成QT环境(有时可能正是您想要的)。

如果要将本机c ++对象任意暴露给其他嵌入式脚本环境,请结帐SWIG。 SWIG类似于toLua工具,但适用于许多可嵌入语言,如 lua,c#,tcl,java python 等等。从经验来看,到Lua使脚本的绑定对象和方法成为一个不那么痛苦的过程,我也没有听过很多关于SWIG的坏事。