当前位置: 首页 > 知识库问答 >
问题:

Scripting.Dictionary的性能选择

锺离辰沛
2023-03-14

我正在用Excel-VBA编写一个带有几个按钮的管理器。

    null
  • 销售商向许多客户销售许多产品

我正在生成一个新的Excel选项卡,其中包含上一个年/月t数据,按销售商分组。

重要注意事项:

    null

但我并不以此为荣,至少现在还没有。

我的代码主要基于scripting.dictionaryt映射数据,然后对obj中的每个键使用...next key将分组数据设置为新创建的选项卡。

我不确定,但以下是我的想法:

  • 如果nscripting.dictionary中的总键,并且在聚合total-money之前需要检查obj.exists(str)。它将运行n字符串比较返回false.
  • 类似地,当我设置seller=obj(seller_name)
  • 时,它将运行maximun n字符串比较。

我想让我的想法出错。但是如果我没有错的话,我的下一步(也是最后一个希望)是用tries编写我自己的类对象。

我只会明天开始编码,我想要的只是一些确认,如果我在正确的方式,或一些建议,如果我在错误的方式做它。

你有什么建议吗?提前谢了。

共有1个答案

孔理
2023-03-14

超过内存限制

简言之:

  • 主要问题是因为我使用了存储信息(预处理)的动态编程方法来加快执行时间。
  • 我的代码现在运行时间~13秒
    null
    null

我用cls_trie实现创建了一个GitHub存储库,并添加了一个excel文件,并给出了使用示例。

我是excel-vba的新手(现在已经用了4个月了)。可能有一些方法可以改进我的cls_trie实现,我愿意接受建议:

Option Explicit

Public Keys As Collection
Public Children As Variant
Public IsLeaf As Boolean

Public tObject As Variant
Public tValue As Variant

Public Sub Init()
    Set Keys = New Collection
    ReDim Children(0 To 255) As cls_trie
    IsLeaf = False

    Set tObject = Nothing
    tValue = 0
End Sub

Public Function GetNodeAt(index As Integer) As cls_trie
    Set GetNodeAt = Children(index)
End Function

Public Sub CreateNodeAt(index As Integer)
    Set Children(index) = New cls_trie
    Children(index).Init
End Sub

'''
'Following function will retrieve node for a given key,
'creating a entire new branch if necessary
'''
Public Function GetNode(ByRef key As Variant) As cls_trie
    Dim node As cls_trie
    Dim b() As Byte
    Dim i As Integer
    Dim pos As Integer

    b = CStr(key)
    Set node = Me

    For i = 0 To UBound(b) Step 2
        pos = b(i) Mod 256

        If (node.GetNodeAt(pos) Is Nothing) Then
            node.CreateNodeAt pos
        End If

        Set node = node.GetNodeAt(pos)
    Next

    If (node.IsLeaf) Then
        'already existed
    Else
        node.IsLeaf = True
        Keys.Add key
    End If

    Set GetNode = node
End Function

'''
'Following function will get the value for a given key
'Creating the key if necessary
'''
Public Function GetValue(ByRef key As Variant) As Variant
    Dim node As cls_trie
    Set node = GetNode(key)
    GetValue = node.tValue
End Function

'''
'Following sub will set a value to a given key
'Creating the key if necessary
'''
Public Sub SetValue(ByRef key As Variant, value As Variant)
    Dim node As cls_trie
    Set node = GetNode(key)
    node.tValue = value
End Sub

'''
'Following sub will sum up a value for a given key
'Creating the key if necessary
'''
Public Sub SumValue(ByRef key As Variant, value As Variant)
    Dim node As cls_trie
    Set node = GetNode(key)
    node.tValue = node.tValue + value
End Sub

'''
'Following function will validate if given key exists
'''
Public Function Exists(ByRef key As Variant) As Boolean
    Dim node As cls_trie
    Dim b() As Byte
    Dim i As Integer

    b = CStr(key)
    Set node = Me

    For i = 0 To UBound(b) Step 2
        Set node = node.GetNodeAt(b(i) Mod 256)

        If (node Is Nothing) Then
            Exists = False
            Exit Function
        End If
    Next

    Exists = node.IsLeaf
End Function

'''
'Following function will get another Trie from given key
'Creating both key and trie if necessary
'''
Public Function GetTrie(ByRef key As Variant) As cls_trie
    Dim node As cls_trie
    Set node = GetNode(key)

    If (node.tObject Is Nothing) Then
        Set node.tObject = New cls_trie
        node.tObject.Init
    End If

    Set GetTrie = node.tObject
End Function

您可以在上面的代码中看到:

    null
  • 我可能永远不会更多地使用scripting.dictionary,即使事实证明它可能比我的cls_trie实现要好。

谢谢大家的帮助。

 类似资料:
  • 问题内容: 我偶然发现了Java 8中的Optional类-我真的很喜欢用isPresent()方法调用替换代码中一些空检查(字面意思是“值存在吗?”)的方法。 我的问题是:那会不会导致我的代码性能降低?我只是猜测简单的null检查可能会便宜一些,而且我在字节码读取/解释方面还不是很好,所以我真的很感兴趣您对此主题的想法。 问题答案: 只是一个普通的通用类,其中包含类型T的引用。因此,它添加了一个

  • 在 Photoshop 中适当设置性能首选项可帮助您的计算机以最佳速度稳定运行,不会出现冻结、滞后或延迟。根据您系统上的可用资源来调整这些首选项,以便最大程度提升您的 Photoshop 体验。 调整分配的内存 限制历史记录状态 管理暂存盘 效率指示器 调整高速缓存级别 设定 GPU 设置 恢复和后台存储选项 Photoshop 提供了一组首选项(“首选项”>“性能”)来帮助您优化对内存、高速缓存

  • 问题内容: 从MySQL中的多个表中选择时,以下两个查询均返回相同的结果集。 这些查询中的一个比另一个查询 更好 或更有效吗?根据我在一个小的数据集(每个表中约有2000行)的测试中,它们都在大约相同的执行时间上返回了相同的结果集。 查询1: 查询2: 问题答案: 它们是相同的,但是语法不同。因此,您不应该期望这两种语法之间的性能差异。但是,建议使用最后一种语法(ANS SQL-92语法),有关更

  • 问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我正在寻找可以改善jQuery调用选择器性能的任何方式。具体来说是这样的: 是不是快 我想可能是这样,但是我不知道jQuery是否足够聪明,可以首先通过标记名来限制搜索,等等。任何人都对如何制定jQuery选择器字符串以获得最佳性能有任何想法? 问题答案: 毫无疑问, 首先通过标记名进行

  • 我有一个字符串,这些字符串与要检索的特定值相关(例如、、...)。我从通过HTTP APIendpoint接收的查询中接收到这个列表。 有没有更好的方法来动态返回给定字符串的值?性能至关重要,因为此泛型方法的调用频率很高。

  • 本文向大家介绍asp中Scripting.Dictionary字典对象使用示例,包括了asp中Scripting.Dictionary字典对象使用示例的使用技巧和注意事项,需要的朋友参考一下 vbscript的Scripting.Dictionary创建了类似于Key索引对应Value值的字典对象,通过Key直接索引到指定的Value。 VBScript中Scripting.Dictionary使