Почему я вижу, что вычисления выполняются в 64-битном Excel, примерно в 5-6 раз медленнее, чем в 32-битном Excel? - PullRequest
0 голосов
/ 27 февраля 2020

Я тестирую потенциальные улучшения производительности с помощью сложных формул для больших наборов данных и пробую копировать несколько формул SUMPRODUCT до конца набора данных, затем вычислять в ручном режиме и рассчитывать время расчета как для 64-битного офисного устройства, так и для 32-битного офисного device.

Для примера у меня были следующие результаты: 32 бита - 7 минут 64 бита - 1 час

Есть ли какая-либо причина, по которой приведенный ниже код будет работать по-другому? Я бы ожидал обратного, если есть какая-либо разница.

Function SysMemory()
    Dim oInstance
    Dim colInstances
    Dim dRam                  As Double
    Set colInstances = GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_PhysicalMemory")
    For Each oInstance In colInstances
        dRam = dRam + oInstance.Capacity
    Next
    SysMemory = dRam / 1024 / 1024 & "MB"
End Function
Sub Calc_Timer()

    ' Setup and start timer
    Application.Calculation = xlCalculationManual
    Dim StartTime As Double
    Dim TimeTaken As String
    StartTime = Timer


    ' Find last row in spreadsheet based on Column C then copy down all formulas
    Dim Lastrow As Long
    Lastrow = Range("C" & Rows.Count).End(xlUp).Row
    Range("S2:Y102").FillDown


    ' Calculate then paste as values except for top row to keep live formulas
    Application.Calculate
    Range("S3:Y102").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False

    ' Check office version
    Dim OfficeVersion As String
    If Win64 Then
        OfficeVersion = "Excel Version: V" & Application.Version & " 64-Bit"
    Else
        OfficeVersion = "Excel Version: V" & Application.Version & " 32-Bit"
    End If

    ' Report time taken
    TimeTaken = Format((Timer - StartTime) / 86400, "hh:mm:ss")

    Application.Calculation = xlCalculationAutomatic

    MsgBox "Time Taken: " & TimeTaken & " (hours, minutes, seconds)" & vbCrLf & _
            "Processor: " & CreateObject("WScript.Shell").RegRead("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\ProcessorNameString") & vbCrLf & _
            "RAM: " & SysMemory() & vbCrLf & OfficeVersion & vbCrLf & "Operating System: " & Application.OperatingSystem

End Sub

Пример формул приведен ниже:

S2:

=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0))

T2:

=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0),'Raw Data'!$G:$G)

U2:

=SUMPRODUCT(--(ISNUMBER(SEARCH($C2,'Raw Data'!$A:$A)))*(((ROUNDDOWN(H2,0)>='Raw Data'!$L:$L)*(ROUNDDOWN(H2,0)<='Raw Data'!$W:$W))+((ROUNDUP(I2,0)>='Raw Data'!$L:$L)*(ROUNDUP(I2,0)<='Raw Data'!$W:$W))+((ROUNDDOWN(H2,0)<='Raw Data'!$L:$L)*(ROUNDUP(I2,0)>='Raw Data'!$W:$W))>0),'Raw Data'!$H:$H)

V2:

=U2/T2

W2:

=COUNTIF(B3:B2305,B2)

X2:

=ROUNDDOWN(H2,0)

Y2:

=ROUNDUP(H2,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...