代码之家  ›  专栏  ›  技术社区  ›  corné

轻量级C++脚本库

  •  3
  • corné  · 技术社区  · 15 年前

    我目前使用 QtScript 在我的C++应用程序中编写脚本功能,但是它在CPU上相当重。当一个线程评估一个循环中的所有脚本时,CPU使用率将增加到90%-100%。即使我让它每5个脚本休眠1毫秒,它仍保持在75%以上的CPU使用率。

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

    编辑:

    我现在意识到这是正常的行为,而不是qtscript中的一些霸占bug。尽管如此,还是很有趣地听到有哪些(lighweight)脚本库可用。

    9 回复  |  直到 15 年前
        1
  •  16
  •   Adrian Grigore    15 年前

    看一看 Lua 在游戏中经常使用,所以性能一定很好。

        2
  •  12
  •   peterchen    15 年前

    嗯,你期待什么?除非脚本必须等待磁盘或用户I/O,否则CPU 应该 100%点钟跑步。

    你的问题是它会持续很长时间吗?

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

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

    [编辑]
    稍微有点不同的问题:当没有要处理的脚本时,CPU是100%的吗?

    如果你正在处理一些事情,100%的CPU是好的和健康的。

    CPU总是很忙,当前线程总是消耗它正在运行的核心的100%。”0%的CPU活动“实际上意味着所有的周期都花费在一个系统空闲线程中(它属于您在任务管理器中看到的“系统空闲进程”)。

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

        3
  •  3
  •   anon    15 年前

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

    以下是一个有趣的对比,作为某些人工语言的背景: iolanguage .

        4
  •  2
  •   leander    15 年前

    我听说了一些好消息 TinyScheme . 尽管如此,我们在这里使用Lua(在游戏开发工作室中,针对嵌入式和手持系统)。

    不过,需要注意的是——特别是Lua,但我认为这些语言适用于以下许多语言:

    • 一个定制的轻量小对象分配器可以获得很多性能;其中许多语言都是重分配的。使用池或基于帧的分配器可能是值得的,这取决于您可以摆脱什么。
    • 根据所使用的GC策略(因为这些语言中的大多数都是垃圾收集的),您将希望保持GC扫描区域较小——例如,总的来说,一个较小的Lua堆大小。花费一些时间重新组织数据以使其超出GC的域(例如保持它的C++侧,以某种方式标记它,这样GC知道避免它,等等)可以帮助。
    • 同样,增量垃圾收集也是一个巨大的胜利。我建议尝试——在某些情况下(小堆),我发现完全GC比增量GC更快。
        5
  •  2
  •   Dolphin    15 年前

    我个人建议Lua在我们的嵌入式平台中广泛使用它。如果您在Windows上运行,您可能可以使用类似luajit的工具使您的lua更快。

    不过,既然没人提到,你也可以看看松鼠。( http://squirrel-lang.org/ )我没有这方面的经验,但我认为这看起来很有希望。

    对于您当前的问题,如果没有任何代码可以阻止它,那么任何代码都将占用CPU的100%。

    类似(伪代码):

    对于(i=11000000000) n=n+i 结束

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

        6
  •  1
  •   Alexander Gladysh    15 年前
        7
  •  1
  •   beef2k    15 年前

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

    • 您的应用程序中会经常使用脚本吗?
    • 脚本会很复杂吗?
    • 您是否向脚本引擎公开了许多功能?
    • 您是否希望Qt能够很好地集成?

    我也建议Lua,但是,您应该记住以下几点:Lua是在纯ANSI C中实现的。这使得Uber可移植,但是如果您在C++环境中开发,它将导致大量的“打包”类。尤其是当您想公开qt功能(包括 SIGNAL S SLOT S和 PROPERTY s),这会导致大量重复的代码。

        8
  •  0
  •   piotr    15 年前

    您还可以使用 spidermonkey 我认为JavaScript比Lua更广泛。

        9
  •  0
  •   JQ.    15 年前

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

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

    如果您想将本机C++对象任意地暴露到其他嵌入式脚本环境中,请参见 SWIG . swig类似于tolua工具,但适用于许多可嵌入的语言,如 Lua,C,TCL,Java 蟒蛇 举几个例子。根据经验,Tolua使绑定对象和方法到脚本的过程不那么痛苦,而且我也没有听到关于Swig的很多坏消息。