言語用のコンパイラと仮想マシンを実装しました。実装はC#で行われ、スタックベースのVMはリフレクションを使用して組み込み関数のセットに対して関数呼び出しを行います。MethodInfoでの呼び出しのスピードアップ
コードの多くは単にスタック値をプッシュしたりポップしたりするだけですが、処理の主役は関数呼び出しです。現在、関数呼び出しの実装は次のようになっています。
すべてのデータ項目は、カスタムタイプシステム(ネイティブタイプが使用されていません)を使用するオブジェクトです。明確化:これはインスタンスメソッドであり、静的ではありません。
パフォーマンステストでは、このMethodInfo.Invoke
が非常に遅いことが示唆されています。おそらく、コンパイラでより多くの準備作業を行い、より良いコードを生成することによって、可能な限り高速で関数呼び出しを行う方法が問題です。
提案に応じて、代理人を作成することもできます。残念なことに、デリゲートがクラスの特定のインスタンスまたは静的メソッドにバインドされている必要があり、インスタンスを作成した後にデリゲートを作成すると、目的を破ることができます。
私は投票を終了しますが、私の目には全く問題がありません。コンパイラは、最低でもMethodInfo.Invoke()
より速く、最高のパフォーマンスを得るために、仮想マシンのインスタンスメソッドに対して関数呼び出しを実装する方法を教えてください。
リフレクションではなく、コード生成を使用することをお勧めします。 –
数年前、 'IKVM.Reflection'が代わりに作成されましたが、最近主な開発者によって中止されました。 Microsoftが.NETソースをオープンソース化しているので、corefxリポジトリhttps://github.com/dotnet/corefx/issues –
@LexLiでディスカッションを行うことで、パフォーマンス面で意見を確認することもできます。私はおそらく、コンパイルすることを試みるまで、corefxの人たちに迷惑をかけるでしょう。 –