0

クラスの関数CalculateLinearRegression()を呼び出すメソッドがあります。が呼び出されるたびに約 3,500 回呼び出されます。WorksheetFunction クラスをメソッドに挿入するので、クラスのインスタンスが 1 つだけ作成されることがわかります。LinEstExcel.Application.WorksheetFunctionLinEstCalculateLinearRegression()

の各呼び出しにCalculateLinearRegression()は約 10 分かかりますが、LinEstすべてを遅くしているのは関数であると確信しています (への呼び出しを削除しLinEst、結果をハードコーディングすると、メソッドは数秒で実行されます)。

かなりの計算を行っていることに感謝しLinEstますが、この遅延を引き起こすほど多くのことを行っているとは思えません。したがって、遅延を追加しているのはおそらく Excel 関数の呼び出しであると思います。これを高速化する方法、または関数の C# 直接置換のいずれかを知っている人はいLinEstますか?

4

3 に答える 3

1

LinEstの代替C#実装がいくつかありますが、直接保証することはできません。たとえば、ここで議論があります:ExcelのLINESTに相当するC#は何ですか?

長時間実行する関数にもサポートを追加したいのですが、質問にコメントするのに十分な情報がありません。それがどのように見えるかのサンプルを投稿することができますか?すべてを遅くしているのはExcelの呼び出しだけですか?

于 2012-10-24T09:34:57.017 に答える
1

個人的には、どうしても必要な場合を除いて、Excelの相互運用機能を使用しないようにします(たとえば、ファイルをバイナリMS Excel形式で保存する場合)。Excelの自動化には、パフォーマンスの面でかなり恐ろしいコストがかかります。

LINESTが提供する機能が必要な場合は、次のような記事のコードを使用することを検討して ください。http: //www.codeproject.com/Articles/25335/An-Algorithm-for-Weighted-Linear-Regression自分でコードを使ったので、記事は高く評価されているようです。

于 2012-10-24T09:40:37.780 に答える
1

WorksheetFunction などの Excel オブジェクト モデルへの各呼び出しは、Interop-Com を経由する必要があります。Interop のオーバーヘッドが高いため、複数の呼び出しは低速です。

簡単な解決策の 1 つは、Excel-DNA を使用して (何倍も高速な) XLL インターフェイスに切り替えることです。

于 2012-10-24T10:02:44.390 に答える