我目前在我的C ++应用程序中使用QtScript来编写脚本功能,但它在cpu上相当“重”。当线程评估循环中的所有脚本时,cpu使用率增加到90%-100%。即使我每5个脚本让它睡眠1毫秒,它仍然高于75%的CPU使用率。
还有其他易于实现的脚本框架比QScript轻得多吗?
修改
我现在意识到这是正常的行为,而不是QtScript中的一些麻烦。听听哪种(轻量级)脚本库可用仍然很有趣。
答案 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,但我认为这些适用于许多这些语言:
答案 4 :(得分:2)
我个人会建议Lua在我们的嵌入式平台中广泛使用它。如果您在Windows上运行,您可以使用像LuaJIT这样的东西来让您的Lua更快
但是,由于没有人提及它,你可能还想看看Squirrel(http://squirrel-lang.org/)。我没有任何经验,但我认为它看起来很有希望。
对于您当前的问题,如果没有任何阻止它的内容,任何代码都会占用100%的CPU。
类似(伪代码):
有(ⅰ= 1,10000000000000) N = N + I 结束
将占用100%的CPU,直到它(几乎)以任何语言完成,因为没有什么可以阻止它执行。
答案 5 :(得分:1)
这实际上取决于几个因素:
我也推荐Lua,但是,你应该记住以下几点:Lua是用纯ANSI C实现的。这使得它非常便携,但是如果你在C ++环境中开发,它会导致很多“包装”类。特别是当您想要公开Qt功能(包括所有SIGNAL
,SLOT
和PROPERTY
s)时,会导致大量重复的代码。
答案 6 :(得分:1)
答案 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的坏事。