2012-10-24 29 views
0

我有一個方法CalculateLinearRegression(),它調用Excel.Application.WorksheetFunction類的LinEst函數。每調用一次CalculateLinearRegression()稱爲LinEst稱爲約3,500次。我將WorksheetFunction類注入到我的方法中,所以我知道只有一個類的實例被創建。緩慢運行的C#調用Excel函數

CalculateLinearRegression()的每次調用需要大約10分鐘,我確信它是LinEst功能減慢寄託都向下(脫調用LinEst和硬編碼的結果意味着在幾秒鐘運行的方法)。我很欣賞LinEst正在做一些公平的計算,但我懷疑它造成了這麼大的延遲,因此我認爲這可能是對Excel函數的調用會增加延遲。有沒有人知道要麼加快速度,要麼C#直接替換LinEst函數?

+0

你有沒有簡介它?它*可能是互操作性的阻礙,但是由於該方法[相當有據可查](http://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.worksheetfunction.linest .aspx)你看過自己重新實現嗎? –

+2

你可以調用宏/使用定義的功能,而不是多次調用。 – weismat

+0

另請參閱:http://stackoverflow.com/q/7792088/50447 –

回答

1

LinEst有一些替代的C#實現,但我不能直接擔保任何。這裏有一個討論,例如:What is the C# equivalent to LINEST from Excel?

我想爲您的長時間運行功能添加一些支持,但是您的問題中沒有足夠的信息來發表評論。你能發表一個樣品嗎?這只是Excel的調用會放慢一切嗎?

1

就我個人而言,我會避免使用Excel互操作,除非您需要絕對(例如,將文件保存爲二進制MS excel格式)。自動化Excel在性能方面涉及一些相當可怕的成本。

如果你只需要通過LINEST提供的功能,可以考慮使用代碼的文章,如下列: http://www.codeproject.com/Articles/25335/An-Algorithm-for-Weighted-Linear-Regression 雖然我還沒有使用的代碼自己,文章似乎被高度重視。

1

每次調用Excel對象模型(如WorksheetFunction)都必須通過Interop-Com。由於Interop的開銷很大,所以多次呼叫很慢。

一個簡單的解決方案可能是使用Excel-DNA切換到XLL界面(快多倍)。