0

現在、次の方法を使用して、Visual Studio 2010のC#アプリからC#スクリプトファイル(http://www.csscript.net )を呼び出しています。

var script = new AsmHelper(CSScript.Load(
             @"C:\temp\CSScriptTest\CSScriptTest\cstest.cs"));
script.Invoke("*.LoopTest");

しかし、このパフォーマンスは、このメソッドを使用して同様のIronPythonスクリプトを呼び出す場合の約2倍であることに気づいています。

var ironPythonRuntime = Python.CreateRuntime();
dynamic loadPython = ironPythonRuntime.UseFile(
                     @"C:\temp\IronPythonTest\IronPythonTest\pytest.py");
loadPython.LoopTest();

パフォーマンスの高いC#スクリプトを呼び出す方法はありますか?

4

2 に答える 2

1

別の方法があります。CS-Scriptのパフォーマンスが実際にはわからないため、それらを比較することはできませんが、CompilerParameters.GenerateInMemoryCodeDomProvider.CompileAssemblyFromFileメソッドと一緒に使用して、それを呼び出すことができます。GenerateInMemoryは、それが言うことを実行し、ディスクに書き込む代わりに、プロセスのメモリにアセンブリを生成します。CompileAssemblyFromSourceを使用し、streamreaderを使用して.csファイル内のすべてを読み取ることもできます。

于 2012-08-21T20:09:00.773 に答える
1

Oleg Shilo (CS-Script の作成者) から得た回答は次のとおりです。

実際、CS-Script を使用するメリットはパフォーマンスにあります。

パフォーマンスに関しては、IronPython と CS-Script 実行モデルの違いを覚えておくことが重要です。CS-Script (および Boo) は CLR に依存しており、実行前にスクリプトをコンパイルします。IronPython は DLR に依存しており、実行中にスクリプトを解釈します。

したがって、CS-Script スクリプトでは、スクリプトのコンパイルに関連する起動オーバーヘッドが常に発生します。ただし、スクリプトがロード (コンパイル) された後、CS-Script はマネージ コードで可能な限り最高のパフォーマンスを示しました。これは、実行時にスクリプトがスクリプトではなく通常のアセンブリになり、パフォーマンスがスクリプト化されていないシナリオと同じになるためです。したがって、テストに複数の LoopTest 呼び出しがある場合、パフォーマンスの「状況」は大きく異なります。ロードと最初の LoopTest 呼び出しは比較的遅くなりますが、LoopTest の次の呼び出しは超高速になります。

起動時のオーバーヘッドを軽減するために、CS-Script はキャッシング メカニズム (デフォルトで有効) を使用しており、前回の実行以降にスクリプトが変更されていない場合、再コンパイルは行われず、以前のコンパイル結果が再利用されます。

したがって、最高のパフォーマンスを得るには:

スクリーンショット

  • (可能であれば) 実行間でスクリプトを変更しないようにしてください。
  • CSScript.CacheEnabled = true (デフォルトで有効) 経由でキャッシュを使用する
  • 呼び出しのディスパッチ スタイル (Invoke(string methodName)) は、単一の呼び出しには問題ありませんが、複数の呼び出しには、GetStaticMethod またはより適切な AlignToInterface を使用します。他のすべての規則とは対照的に、Invoke はリフレクションに依存しているため、パフォーマンス上の利点は非常に重要です。これは、performance.cs サンプル スクリプトのプロファイリング結果です。
于 2012-08-30T14:36:13.320 に答える