2017-09-06 9 views
1

言語用のコンパイラと仮想マシンを実装しました。実装はC#で行われ、スタックベースのVMはリフレクションを使用して組み込み関数のセットに対して関数呼び出しを行います。MethodInfoでの呼び出しのスピードアップ

コードの多くは単にスタック値をプッシュしたりポップしたりするだけですが、処理の主役は関数呼び出しです。現在、関数呼び出しの実装は次のようになっています。

すべてのデータ項目は、カスタムタイプシステム(ネイティブタイプが使用されていません)を使用するオブジェクトです。明確化:これはインスタンスメソッドであり、静的ではありません。

パフォーマンステストでは、このMethodInfo.Invokeが非常に遅いことが示唆されています。おそらく、コンパイラでより多くの準備作業を行い、より良いコードを生成することによって、可能な限り高速で関数呼び出しを行う方法が問題です。


提案に応じて、代理人を作成することもできます。残念なことに、デリゲートがクラスの特定のインスタンスまたは静的メソッドにバインドされている必要があり、インスタンスを作成した後にデリゲートを作成すると、目的を破ることができます。

私は投票を終了しますが、私の目には全く問題がありません。コンパイラは、最低でもMethodInfo.Invoke()より速く、最高のパフォーマンスを得るために、仮想マシンのインスタンスメソッドに対して関数呼び出しを実装する方法を教えてください。

+0

リフレクションではなく、コード生成を使用することをお勧めします。 –

+0

数年前、 'IKVM.Reflection'が代わりに作成されましたが、最近主な開発者によって中止されました。 Microsoftが.NETソースをオープンソース化しているので、corefxリポジトリhttps://github.com/dotnet/corefx/issues –

+0

@LexLiでディスカッションを行うことで、パフォーマンス面で意見を確認することもできます。私はおそらく、コンパイルすることを試みるまで、corefxの人たちに迷惑をかけるでしょう。 –

答えて

2

さて、あなたはそのMETHODINFOメソッドを呼び出す式を作成するには、System.Linq.Expressions(Expression.Call、Expression.Parameter)から

使用のもの...あなたの主な問題はMethodInfo.Invokeであることを確認している場合は、インスタンス+引数のパラメータを渡します。

この式をAction<tInstance, tArgs[]>にコンパイルします(これらのタイプはわかりません)。

あなたのCallInfoクラスインスタンスにアクションをキャッシュします。

必要に応じてそのアクションを呼び出します。

+1

ここで重要な点は、連続する呼び出しを行うための 'Delegate'を作成することです。リフレクションやエクスプレッションなどを使用して作成しても問題ありません。 – thehennyy

+0

@soonts:はい、私はその道を知っていますが、試したことはありません。アクション<>はデリゲートだけですか? –

+0

@thehennyy:式ではなくMethodInfoからデリゲートを作成しますか?どうやって?それは答えに値するでしょうか? –

関連する問題