1

Visual Studio 2008の拡張機能を作成していますが、C ++用に独自のパーサーを作成したくなかったため(マゾヒスティックではありません)、VCCodeModelを使用しています。

これらのCOMオブジェクトから単純なフィールドを取得するには、他のどの操作よりも桁違いに時間がかかります。非常に大規模なC ++プロジェクトのメソッドレベルにドリルダウンしているため、再帰の最低レベルでこの非効率性があります。 。

   vcCodeBaseFunctions = ((Microsoft.VisualStudio.VCCodeModel.VCCodeElements)
                                (vcCM.Functions));
   int i = 0;
   for (i = 1; i <= vcCodeBaseFunctions.Count; i++)
   {
     if (vcCodeBaseFunctions.Item(i).Kind == vsCMElement.vsCMElementFunction)
                parent.AppendChild(MethodWrapper.VCCodeFunctionToXML(
                          (VCCodeFunction)vcCodeBaseFunctions.Item(i)));
   }

上記のコードは、プロジェクトの基本レベルですべての関数を反復処理し、それらをXMLに変換してから、保存します。XMLメソッドは、名前、パラメーターなど、VCCodeFunction内の複数のフィールドを呼び出します。

この目的のために、マネージC ++はC#よりも高速ですか?マネージC++のバックエンドがC#とどのように異なるかについての理解が不十分ですが、私の直感では、C ++のマネージコードとアンマネージコードの間の「コンテキストスイッチ」コストが少ないと思いますが、間違っていますか?CodeModelを使用してC++でマネージコードとアンマネージコードを繰り返し切り替えると信じていることから、かなりの速度低下が見られます。マネージC ++の方が高速であると想定して正しいですか?

4

3 に答える 3

1

.NETのCOM相互運用層にはオーバーヘッドがあります。C ++を使用する場合は、COMアクセスをネイティブコードに移動できます。これにより、コードアクセスのそのセクションが高速化されます。

ただし、C ++ / CLIの使用を計画している場合は、ある時点でネイティブ->マネージド相互運用機能を使用することになります。チェーンのどこかでデータをマーシャリングしますが、これをこれらのループの外に移動できると少し速くなる可能性があります(再帰を100%ネイティブにすると、相互運用機能の呼び出しがはるかに少なくなります)。

そうは言っても、VCCodeModelは特に高速ではありません-COM相互運用機能でオーバーヘッドが発生することに同意しますが、使用しているプロファイラーがこれを誇張している可能性があることに注意してください。これは、トレースプロファイラーを使用している場合に特に当てはまります。これは、実際のリリースの実行中よりもプロファイリング中にこれらの呼び出しに多くの時間を費やすためです。プロファイラーは完全ではありません。これは、プロファイラーが原因で結果が歪んでいる場合があります。

私はあなたの潜在的な速度の向上はポートに値しないだろうと思う-より多くの情報なしで確実に知ることは難しいだろうが。

于 2009-08-08T22:40:47.243 に答える
0

アドイン/パッケージ言語の速度は、コードモデルの速度と比較して何もありません。編集:わかりました、多分私は船外に出ました、しかし真剣に、ここの最初の文は正しいです。

于 2009-08-08T22:02:16.993 に答える
0

C++の方が高速になる可能性は低いでしょう。

独自のパーサーを作成すると、実行速度が速くなる可能性があります。もちろん、独自のパーサーを作成するには、かなり時間がかかる場合があります。

于 2009-08-08T22:16:43.797 に答える