2009-05-27 13 views
3

私は現在、C++アプリケーションのスクリプト機能にQtScriptを使用していますが、CPU上ではかなり重いです。スレッドがループ内のすべてのスクリプトを評価すると、CPU使用率は90%〜100%に増加します。 5つのスクリプトごとに1ミリ秒間スリープ状態にしても、75%のCPU使用率を超えています。軽量C++スクリプティングライブラリ

QScriptよりはるかに軽い実装が可能なスクリプティングフレームワークはありますか?

編集:

私は今、これは正常な動作ではなくQtScriptでいくつかのホギングのバグであると認識。それでも、どんな種類の(lighweight)スクリプトライブラリが利用できるか聞いても面白いです。

+2

あなたは何かばかげているのではないですか?あなたはテストとして簡単なスクリプトを試しましたか? –

+0

@mgb:amen - あなたの中間表現(バイトコード、逆アセンブリ、構文木など)を見て覚えておいてください。何が起こっているのかを正確に理解できない場合でも、いくつかの問題は明らかに明白です! Alloc/deallocリストやその他のメモリ使用状況も役立ちます。 (QScriptの経験があれば、誰でも追加の情報でチャイムを鳴らすことができますか?) – leander

答えて

16

Luaをご覧ください。ゲームで頻繁に使用されるため、パフォーマンスはかなり良いはずです。

+0

ああ、私はルアについて聞いたことがあります。私は明日いくつかのテストを実行します。 –

+0

100%CPUを使用してブロックしないLuaスクリプトを実行しませんか?私はそう望むだろう、そうでなければ私はそれが壊れていると思うだろう – KeyserSoze

+0

私はそう思っていますが、彼は高速のスクリプトライブラリについて尋ねたので、私は推薦をしました。 –

3

LuaはインタプリタとC++の間で通信するためにスタックを使用しているので良いです。物事を簡素化する参照カウントがあなたには見えないので、これは良いことです。

いくつかのiolanguageの背景として興味深いコンパイルがあります:iolanguage

12

あなたは何を期待していますか?スクリプトがディスクまたはユーザーI/Oを待たなければならない場合、CPU を100%で実行する必要があります。

あなたの問題は長く続きますか?

または、アプリケーションが応答しないことを確認しますか?

この場合、スクリプトはすべてのUIインタラクションが実行されるスレッドをブロックしているという問題があります。一般的な解決策は、すべてのUI入力(「スクリプトをキャンセル」ボタン:)を除く)をブロックし、実際の処理を別のスレッドに移動することです。

[編集]
少し異なる質問:処理すべきスクリプトはありませんが、100%のCPUがありますか?

何かを処理している場合、100%CPUは良好で健康的です。

CPUは常にビジー状態です。現在のスレッドは、実行中のコアの100%を常に消費します。 「0%CPUアクティビティ」は、実際にはすべてのサイクルがシステムアイドルスレッド(タスクマネージャに表示される「システムアイドルプロセス」に属します)で費やされたことを意味します。

単純な例として、1つのアプリケーションスレッドがアクティブで、CPU使用率が40%で、タスクマネージャの更新間隔が1秒の場合、400msのCPU時間がアプリケーションに費やされ、600msがアイドルスレッドで費やされました。

+0

いいえ、何もブロックしていないか、遅いです。私は多くのスレッドを持っており、そのうち1つはqscriptを処理します。ほとんどのスレッドは約1〜2%のCPUを使用していますが、qscriptスレッドは約90%を使用しています。もちろん、スクリプトは高速で実行する必要がありますが、CPUに負担をかけるべきではありません。おそらく私はこれについて間違っていますが、ほとんどのアプリケーションは100%CPUを使用していません。これはスクリプトでは違うはずはありませんか? –

+0

オペレーティングシステムがどのように処理するかによって、スレッドがCPU時間を必要としない他のプロセスがない場合は、スレッドが90%〜100%のCPU使用率を長期間実行することが可能です。本当にこれを制限したい場合は、スクリプトを実行しているスレッドの優先順位で遊んでみてください。 –

+0

あなたはこれについて正しいと思うし、私はスレッディングについてもっと学ぶべきだと分かっています。しかし、これは私の質問への真の答えではないので、私は代わりにあなたをアップアップします:) –

2

私はTinySchemeについて良いことを聞いたことがあります。つまり、ここではLuaを使用しています(ゲーム開発スタジオで、組み込みシステムとハンドヘルドシステムをターゲットにしています)。

注意観光、しかし - 特にLuaのと、私は、これらはこれらの言語の多くに適用されると思う:

  • カスタム軽量小型オブジェクト・アロケータは、パフォーマンスの多くを得ることができます。これらのlanugagesの多くはalloc-heavyです。プールやフレームベースのアロケータを使用すると、あなたが逃げることができるものに応じて、あなたの価値があるかもしれません。あなたは小さなGCスキャンエリアを維持したいと思う(これらの言語のほとんどはごみを収集しているため)使用したGC戦略に応じて、
  • - 例えば全体的に小さなluaヒープサイズ。 GCのドメイン外にデータを取得するためにデータを再編成するのに時間を費やすことがあります(たとえば、C++側を保持する、GCに何らかの形でタグを付けて回避することなどができます)。
  • 同様に、インクリメンタルガーベジコレクションは、大きな勝利することができます。私は実験をお勧めします - いくつかのケースでは(小さなヒープ)、インクリメンタルよりも速くフルGCを見つけました。
2

私は個人的に私たちの組み込みプラットフォームで広範囲にそれを使用したLuaのをお勧めします。あなたが窓で走っているなら、Luaをさらに速くするためにLuaJITのようなものを使うことができるかもしれません。

しかし誰もそれを言及していないので、リス(http://squirrel-lang.org/)を見てみることもできます。私はそれについての経験は何も持っていませんが、それは有望と思われます。あなたの現在の問題については

それはそれをブロックします何かを持っていない場合、任意のコードがCPUの100%がかかります。

(擬似コード)のようなもののための:

(I = 1,10000000000000) N = N + I エンド

それは(ほとんど)任意の言語で完了するまで

は、CPUの100%がかかります実行を停止するものは何もないからです。

1

それは本当に、いくつかの要因に依存する:

  • ウィル・スクリプティング、アプリケーション内の多くを使用できますか?
  • スクリプトは複雑ですか?
  • スクリプトエンジンに多くの機能を露出させていますか?
  • Qtとの統合に気をつけますか?

Luaもお勧めしますが、Luaは純粋なANSI Cで実装されています。これにより、移植性が向上しますが、C++環境で開発している場合は、たくさんの「ラッピング」クラスにQtの機能を公開したい場合(特にSIGNALSLOTs、PROPERTYs)、多くの重複コードが発生します。

+0

Luaをオール・キャップとして書くことは絶対に避けてください。 http://www.lua.org/about.html#name –

+0

何かをラップする必要はありませんが、選択することもできます。標準的なLuaディストリビューションは、C++と同じくらいうまくコンパイルされます。 私は混合C/C++環境でLuaを使用しますので、ラッパーなしで使用します。 Lua_State *をC言語のすべての関数に渡す必要があるのは(C++のプログラマにとって)厄介なことですが、それは完全に実行可能であり、それほど大きな問題ではありません。 – Dolphin

+0

はい、可能です。しかし、私の指摘は、C++の優れた機能(特にQtとの組み合わせ)は、多くのラッピングにつながる可能性があるということでした。スクリプト内では、ホストアプリケーションのメソッドを呼び出したいので、それらを公開する必要があります。 LuaはC++のファンクタをサポートしていないので、これを実装するのは面倒かもしれません。 – beef2k

0

また、javascriptを埋め込むことができますspidermonkey 私はjavascriptがluaよりも広く普及していると思います。

0

QtScriptには、これまでの説明から何も間違っていません(4.6からそれを使用していますが、これまではまだ新しいですが、今のところ好きです)。 luaやpythonのように、あなたの使い方に依存します。アプリケーションのコア機能をネイティブ(c/C++からコンパイル)して、スクリプトエンジンに最小限のAPIしか公開しないと、一般的には物事をうまく保つことができます。

QtScriptを使用すると、スレッドセーフな方法(QTのスロットと信号オブジェクトモデル)でオブジェクトとそのメソッドを公開し、スクリプト作成オブジェクトをネイティブ関数に簡単に渡すことは比較的簡単です...しかし、 QT環境と統合されています。

ネイティブC++オブジェクトを他の組み込みスクリプト環境に任意に公開する場合は、チェックアウトSWIGを使用します。 SWIGはtoLuaツールに似ていますが、lua、c#、tcl、javapythonのような多くの埋め込み可能な言語で動作します。経験から、toLuaはオブジェクトとメソッドをバインドしてスクリプトを作成しましたが、苦痛を伴うプロセスはほとんどありませんでした。