Страницы: 1
RSS
Скорость пересчета формул, сборник полезной информации для тех кто обеспокоен скоростью вычислений
 
начал копать форум на тему сабжа,информации нашел не очень много и довольно разрозненную, решил объединить для наглядности.
[spoiler]
Цитата
"функции подразделяются на летучие и нелетучие. В подавляющем большинстве случаев движок пересчета Excel пытается считать исключительно то, что действительно нуждается в пересчете, экономя т.о. время затрачиваемое на расчеты. Excel ведет некий реестр, в котором помечаются ячейки/формулы, нуждающиеся в обновлении при ближайшем событии пересчета. Одним из исключений из этого правила являются формулы содержашие летучие функции. Ячейки содержашие такие формулы неизменно помечаются как нуждающиеся в обновлении при любых обстоятельствах. На сегодня (версии 2002-2007), летучими являются следующие функции:
СЛЧИС()
ТДАТА()
СЕГОДНЯ()
СМЕЩ()
ЯЧЕЙКА()
ДВССЫЛ()
ИНФОРМ()
Летучие функции делают летучими формулы их содержащие, а также от них зависящие (Dependencies).
Само по себе понятие летучесть означает, что пересчет функции происходит при каждом событии пересчета на листе, независимо от того, влияют ли изменения вызвавшие данное событие, на результат формулы.
Триггеров события пересчета достаточно, самые привычные из них следующие:
- изменение значения или формулы в ячейке (в т.ч. при использовании Мастера Функций и клавиши F9)
- открытие файла сохраненного в более старой версии
- открытие файла с выбранной опцией пересчета при открытии
- изменение критерия автофильтра
- удаление и вставка строк и столбцов
- добавление, изменение и удаление именованных формул (в т.ч. и именованных диапазонов как частного случая именованных формул)
- изменение имен или порядка расположения рабочих листов
- удаление рабочих листов (но не добавление)
- скрытие и показ строк (в XL2003)
- открытие файлов с расширением *.csv
Все это и многое другое можно прочитать здесь:
http://www.decisionmodels.com/calcsecretsi.htm
http://www.decisionmodels.com/calcsecretsb.htm "
 - KL ака lapink2000

[quote]"см. надстройку RangeCalc.zip здесь:
http://www.decisionmodels.com/downloads.htm
Очень важно: перед проведением замеров, обязательно менять режим пересчета на ручной, иначе данные будут искаженными!
Вот тут можно почитать про особенности мотора расчетов Excel:
http://www.decisionmodels.com/calcsecrets.htm
http://www.decisionmodels.com/optspeed.htm
http://www.decisionmodels.com/memlimits.htm "[quote]
- KL ака lapink2000

вот хороший  макрос с счетчиком времени пересчета формул:
<SPOILER>
Код
Private Declare Function getFrequency Lib "kernel32" _Alias "QueryPerformanceFrequency" (cyFrequency As Currency) As Long
Private Declare Function getTickCount Lib "kernel32" _
Alias "QueryPerformanceCounter" (cyTickCount As Currency) As Long
Function MicroTimer() As Double
'

' Returns seconds.
 Dim cyTicks1 As Currency
 Static cyFrequency As Currency
 '
 MicroTimer = 0

' Get frequency.
 If cyFrequency = 0 Then getFrequency cyFrequency

' Get ticks.
 getTickCount cyTicks1

' Seconds
 If cyFrequency Then MicroTimer = cyTicks1 / cyFrequency
End Function

Sub RangeTimer()
 DoCalcTimer 1
End Sub
Sub SheetTimer()
 DoCalcTimer 2
End Sub
Sub RecalcTimer()
 DoCalcTimer 3
End Sub
Sub FullcalcTimer()
 DoCalcTimer 4
End Sub

Sub DoCalcTimer(jMethod As Long)
 Dim dTime As Double
 Dim dOvhd As Double
 Dim oRng As Range
 Dim oCell As Range
 Dim oArrRange As Range
 Dim sCalcType As String
 Dim lCalcSave As Long
 Dim bIterSave As Boolean
 '
 On Error GoTo Errhandl

' Initialize
 dTime = MicroTimer

 ' Save calculation settings.
 lCalcSave = Application.Calculation
 bIterSave = Application.Iteration
 If Application.Calculation <> xlCalculationManual Then
 Application.Calculation = xlCalculationManual
 End If
 Select Case jMethod
 Case 1

 ' Switch off iteration.

 If Application.Iteration <> False Then
 Application.Iteration = False
 End If
 
 ' Max is used range.

 If Selection.Count > 1000 Then
 Set oRng = Intersect(Selection, Selection.Parent.UsedRange)
 Else
 Set oRng = Selection
 End If

 ' Include array cells outside selection.

 For Each oCell In oRng
 If oCell.HasArray Then
 If oArrRange Is Nothing Then
 Set oArrRange = oCell.CurrentArray
 End If
 If Intersect(oCell, oArrRange) Is Nothing Then
 Set oArrRange = oCell.CurrentArray
 Set oRng = Union(oRng, oArrRange)
 End If
 End If
 Next oCell

 sCalcType = "Calculate " & CStr(oRng.Count) & _
 " Cell(s) in Selected Range: "
 Case 2
 sCalcType = "Recalculate Sheet " & ActiveSheet.Name & ": "
 Case 3
 sCalcType = "Recalculate open workbooks: "
 Case 4
 sCalcType = "Full Calculate open workbooks: "
 End Select

' Get start time.
 dTime = MicroTimer
 Select Case jMethod
 Case 1
 If Val(Application.Version) >= 12 Then
 oRng.CalculateRowMajorOrder
 Else
 oRng.Calculate
 End If
 Case 2
 ActiveSheet.Calculate
 Case 3
 Application.Calculate
 Case 4
 Application.CalculateFull
 End Select

' Calculate duration.
 dTime = MicroTimer - dTime
 On Error GoTo 0

 dTime = Round(dTime, 5)
 MsgBox sCalcType & " " & CStr(dTime) & " Seconds", _
 vbOKOnly + vbInformation, "CalcTimer"

Finish:

 ' Restore calculation settings.
 If Application.Calculation <> lCalcSave Then
 Application.Calculation = lCalcSave
 End If
 If Application.Iteration <> bIterSave Then
 Application.Calculation = bIterSave
 End If
 Exit Sub
Errhandl:
 On Error GoTo 0
 MsgBox "Unable to Calculate " & sCalcType, _
 vbOKOnly + vbCritical, "CalcTimer"
 GoTo Finish
End Sub
</SPOILER>
а вот статьи полезные к изучению:
повышение производительности вычислений
улучшения производительности и ограничений
рекомендации по оптимизации проблем, связанных с производительностью
[/spoiler]
если есть что то теме полезного добавляйте пожалуйста :)
Изменено: Blood81 - 15.05.2014 14:07:05
Страницы: 1
Наверх