古いVB6/* .xlaコードをC#アプリケーションに変換するのに多くの時間を費やしましたが、今では自分自身をメジャーパフォーマンスホール。 C#(VS 2010)のExcelを自動化すると、パフォーマンスに大きな影響を与えるようです。私はテストVB6アプリケーションで「正確な」コードを書いて、約1〜2秒で計算を実行します。 C#のコードが1分以上かかるところ。コードの一般的な流れは次のとおりです(ClientはVB6またはC#アプリケーションのいずれかです)。ExcelオートメーションVB6クライアントアプリケーションとC#クライアントアプリケーションのパフォーマンス
- のみのクライアントアプリケーションの存続期間中に一度行っては
クライアントが作成して開き、ExcelのApplication
クライアントは、計算に必要な必要なアドインをロードするためにExcelを自動化します。
- 各計算のために行わが
を行うクライアントは、既存の* .xlsファイルを閉じて、所望の* .xlsファイルを開くために、Excelを自動化します。
クライアントは3
クライアントが追加Excelからマクロを呼び出すステップで開かれた* .XLSの構成を取得するにはExcelAppObject.Run(「AddIn.xla!GetConfiguration」)を使用して追加Excelからマクロを呼び出しますExcelAppObject.Run( "AddIn.xla!LoadInputs"、InputsXmlString)を使用します。
- マクロは、InputsXmlStringをMSXML.DOMDocument40オブジェクトに読み込みます。
- マクロは=偽Application.Calculation = xlCalculationManualが
- マクロセットApplication.EnableEvents(入力のいくつかの「テーブル」を投入スピードアップするために)オン
- マクロ上のすべての「構成」入力/テーブルループ'入力'ワークシートを開き、それらをクリアします(xmlに渡された 'すべての'入力が含まれていない場合)
- マクロは渡されたすべてのxmlをループし、 '入力'ワークシートの適切な場所にロードします。
クライアントはMSXML.DOMDocument40オブジェクトにDataXmlStringマクロ負荷
- ExcelAppObject.Run( "AddIn.xla!GetResults"、DataXmlString)を使用して追加Excelからマクロを呼び出します。
- マクロは '入力'ワークシートのすべての '構成済み'データ値をループしてクリアします(xmlに渡されたデータに 'すべて'データが含まれていないか、前の計算をクリアしている場合)
これはLoadInputsとは異なります。私たちは、「入力」のワークシート上の適切な場所 - マクロセットにマクロ負荷にDataXmlStringからすべてのデータを入力は、すべての計算のために同じですが、「参加者データが」明らかにそれぞれの計算のための異なるバッチ計算
- を持つことができますApplication.EnableEvents = true
- マクロはアプリケーションをオンにします。Calculation = xlCalculationAutomatic(計算がすべてのデータ/入力がロードされたことを確実にするため)
- マクロは設定されたすべての結果セルをループし、Xml文字列で返します。
だから、あなたが見ることができるように、それぞれの計算のために、私は3つだけの「クロスプロセス」を持って試してみて、その知られている「貧困層の性能を最小化するために、Excel(GetConfiguration、LoadInputs、およびGetResults)に、クライアントからの呼び出しを問題。問題は、VB6アプリケーションから正確に同じコードが呼び出された場合、4-6ステップは約2秒かかることです。クライアントアプリケーションがC#アプリケーションの場合、4-6は約70秒かかります。 すべてこの70秒は、計算を自動に戻すときに手順6で発生します。
Excelと従来のVB6アプリケーションを自動化するC#アプリケーションには既知の問題がありますか?またはC#コードを保持できるようにVB6と同じパフォーマンスを実現するための回避策がありますか?
アプリケーションをリリースモードでビルドし、Visual Studio以外で実行してみてください。 – Stu
私たちはリリースを組み込んでいます。デバッグを開始して問題を発見するために、私たちは現在、LINQPad全体の 'ブローカ'コード/フレームワークの代わりに、より簡単な直接的なスクリプトでLINQPadをテストしています。 – Terry
だから、デバッガを一切取り付けずに実行しようとしましたか? – Stu