excel - 为什么 Excel VBA 代码在某些机器上运行速度慢 2000 倍?

标签 excel vba performance collections cpu

我创建了一个 Excel VBA 宏,可以进行大量数据密集型处理。我经常使用 Collections。在某些 PC 上,它运行得非常快,而在其他 PC 上,它运行得非常慢。我在下面的示例代码中隔离了该问题。请注意,示例代码不是一个功能程序,它只是为了隔离我在更大的程序中遇到的技术问题。

我已经在 4 台不同的机器上测试了该宏。请参阅下面带有 CPU 信息的输出,全部使用“Microsoft® Excel® for Microsoft 365 MSO(版本 2210 Build 16.0.15726.20188)32 位”:

Intel(R) Core(TM) i9-10900K CPU @ 3.70GHz,RAM 16.0 GB: 运行循环耗时 0.09 秒。清除内存耗时 0.04 秒。

第 11 代英特尔(R) 酷睿(TM) i7-1185G7 @ 3.00GHz,RAM 16,0 GB: 运行循环花费了 0.10 秒。清除内存花费了 0.05 秒。

Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz,RAM 32,0 GB: 运行循环耗时 162,58 秒。清除内存花费了 5.48 秒。

Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz,RAM 16.0 GB: 运行循环耗时 201,03 秒。清除内存花费了 6.37 秒。

VBA程序代码:

Option Explicit
    
Sub largeCollection()

    Dim time1 As Single
    Dim time2 As Single
    time1 = Timer


    Dim myCollection As New Collection

    
    Dim I As Long
    Dim aClass1 As Class1
    
    For I = 2 To 50000
        Set aClass1 = New Class1

        aClass1.d1 = I
        aClass1.d2 = I
        aClass1.d3 = I
        aClass1.d4 = I
        aClass1.d5 = I
        aClass1.d6 = I
        aClass1.d7 = I
        aClass1.d8 = I
        aClass1.d9 = I
        aClass1.d10 = I

        aClass1.i1 = I
        aClass1.i2 = I
        aClass1.i3 = I
        aClass1.i4 = I
        aClass1.i5 = I
        aClass1.i6 = I
        aClass1.i7 = I
        aClass1.i8 = I
        aClass1.i9 = I
        aClass1.i10 = I
        
        myCollection.Add aClass1
    Next I
    
    time2 = Timer
    
    Set myCollection = Nothing
    
    'Notify user in seconds
    Debug.Print "Run loop took " & Format((time2 - time1), "0.00") & " seconds. Clearing memory took " & Format((Timer - time2), "0.00") & " seconds."
    
End Sub

自定义类“Class1”的代码:

Option Explicit

Public s1 As String
Public s2 As String
Public s3 As String
Public s4 As String
Public s5 As String
Public s6 As String
Public s7 As String
Public s8 As String
Public s9 As String
Public s10 As String
Public s11 As String
Public s12 As String
Public s13 As String
Public s14 As String
Public s15 As String
Public s16 As String
Public s17 As String
Public s18 As String
Public s19 As String
Public s20 As String

Public v1 As Variant
Public v2 As Variant
Public v3 As Variant
Public v4 As Variant
Public v5 As Variant
Public v6 As Variant
Public v7 As Variant
Public v8 As Variant
Public v9 As Variant
Public v10 As Variant

Public i1 As Long
Public i2 As Long
Public i3 As Long
Public i4 As Long
Public i5 As Long
Public i6 As Long
Public i7 As Long
Public i8 As Long
Public i9 As Long
Public i10 As Long

Public d1 As Double
Public d2 As Double
Public d3 As Double
Public d4 As Double
Public d5 As Double
Public d6 As Double
Public d7 As Double
Public d8 As Double
Public d9 As Double
Public d10 As Double

我已经没有选择了,如果有人能提供解决方案,那就太好了。

最佳答案

我们终于自己找到了答案,虽然不是很令人欣慰...性能差异似乎完全取决于信任中心宏设置。

如果我选择该选项:

  • “通过通知禁用宏”,我必须显式“启用内容”才能在打开工作簿时启用宏。使用此选项宏运行速度减慢 2000 倍
  • “启用 VBA 宏(不推荐;可能运行有潜在危险的代码)”代码运行速度提高 2000 倍。

我希望这 2 个选项具有相同的性能,因为在启用内容后,我启用了 VBA 宏,就像我选择了另一个选项一样。

这意味着我可以获得高性能宏的唯一方法是将选项设置为“启用 VBA 宏(不推荐;可以运行潜在危险的代码)”,这将导致所有工作簿的所有宏都运行默认情况下,即使我会打开来自第 3 方的随机 Excel,这也是一个巨大的安全风险。

关于excel - 为什么 Excel VBA 代码在某些机器上运行速度慢 2000 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74488285/

相关文章:

vba - 在Excel中添加列

excel - 如何在 Excel VBA 中退出 1 个以上的 for 循环?

arrays - 使用VBA过滤掉数组中的空单元格

vba - 将行从一张纸复制到另一张纸

php - Symfony2 应用程序在每次请求时解析 YML

c++ - 高效地创建大量需要访问 "global"对象的小型 C++ 对象

excel - 在 Node.js 中解析 xls/xlsx/xlsm

c# - 为什么 Microsoft.Office.Interop.Excel 会损坏我的 Excel 文件?

vba - 在 Excel 2010 中调用 URL 而不打开网页

performance - 使用impala时,有人知道如何选择数据模型吗?