2009-05-27 73 views
3

我目前使用QtScript作为我的C++应用程序中的脚本功能,但它在cpu上相当“沉重”。当线程评估循环中的所有脚本时,CPU使用率会增加到90%-100%。即使我把它每5个脚本睡1毫秒,CPU使用率仍高于75%。轻量级C++脚本库

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

编辑:

我现在认识到这是正常的行为,而不是在QtScript一些拱错误。听听什么样的(轻量级)脚本库可用仍然很有趣。

+2

你确定你没有做一些愚蠢的事吗?你有没有尝试过一个简单的脚本作为测试。 – 2009-05-27 14:51:28

+0

@mgb:即使你不明白到底发生了什么,也要记住看看你的中间表示(字节码,反汇编,解析树,无论什么),但有些问题可能会非常明显! Alloc/dealloc列表或其他内存使用统计信息也可以提供帮助。 (任何有QScript经验的人都会在意与其他信息的联系吗?) – leander 2009-05-27 16:46:57

回答

16

看看Lua,它经常在游戏中使用,所以表现一定很好。

+0

啊,是啊,我之前听说过Lua。我明天会进行一些测试。 – 2009-05-27 14:05:46

+0

不会执行不阻止使用100%CPU的Lua脚本吗?我希望如此,否则我会认为它坏了。 – KeyserSoze 2009-05-27 20:03:33

3

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

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

12

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

是你的问题,它运行时间很长?

或者说你的应用程序没有响应?

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

[编辑]
稍有不同的问题:在100%的CPU虽然没有脚本来处理?

如果你正在处理的东西,100%的CPU是好的,健康的。

CPU总是处于繁忙状态,当前线程总是会占用正在运行的核心的100%。 “0%CPU活动”实际上意味着所有的周期都花在系统空闲线程中(属于你在任务管理器中看到的“系统空闲进程”)。作为一个简单的示例:如果您有一个应用程序线程处于活动状态,并且CPU使用率为40%,并且您的任务管理器更新时间间隔为1秒,则应用程序上会花费400毫秒的CPU时间,而空闲线程上的时间为600毫秒。

2

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

需要注意的事项,虽然 - 和Lua具体,但我认为这些适用于许多这些语言:

  • 定制轻便的小对象分配器可以得到很多的表现;许多这些lanugages是分配沉重。使用池或基于帧的分配器可能值得您一段时间,这取决于您可以摆脱什么。
  • 根据使用的GC策略(因为大多数这些语言都是垃圾回收),您需要保持GC扫描区域较小 - 例如,整体小卢亚堆大小。花一些时间重新组织数据以将其置于GC域之外(例如,保留C++端,以某种方式标记它,以便GC知道避免它等)可以提供帮助。
  • 同样,增量垃圾收集可以是一个很大的胜利。我建议尝试 - 在某些情况下(小堆),我发现GC的速度比增量快。
2

我个人会推荐Lua在我们的嵌入式平台上广泛使用它。如果你正在windows上运行,你可能会使用类似LuaJIT的东西来使你的Lua更快更快

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

至于你当前的问题,如果没有任何东西会阻止它,任何代码都会占用100%的CPU。

类似的信息(伪代码):

为(I = 1,10000000000000) N = N + I 端

,直到它在(几乎)任何语言完成

将采取100%的CPU因为没有什么可以阻止它执行。

1

这真的取决于几个因素:

  • 威尔脚本中使用了大量的应用程序?
  • 脚本是否会变得复杂?
  • 您是否将很多功能暴露给脚本引擎?
  • 你是否在意Qt的良好整合?

我也推荐Lua,但是,你应该记住下面的内容:Lua在纯ANSI C中实现。这使得它超便携,但是如果你在C++环境中开发,它会导致到很多“包装”类。特别是当你想暴露Qt功能(所有它是SIGNAL s,SLOT s和PROPERTY s)时,它会导致很多重复的代码。

0

你也可以嵌入JavaScript与spidermonkey 我认为JavaScript比卢阿更广泛。

0

从目前为止我所知道的QtScript没有什么问题(只是从4.6开始使用它,所以对它仍然是新的,但到目前为止还是喜欢它)。取决于你如何使用它,就像lua或python一样。如果你保持原生的应用程序核心功能(从c/C++编译),并且只向脚本引擎提供一个最小的API,那么一般来说,你可以让事情保持快速。

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

如果你想任意地将本地C++对象暴露给其他嵌入式脚本环境结帐SWIG。 SWIG与toLua工具类似,但适用于许多可嵌入语言,如lua,c#,tcl,javapython等等。从经验到Luua制定绑定对象和方法到脚本是一个非常痛苦的过程,而且我也没有听到有关SWIG的许多坏事。