VBA I / O性能

时间:2010-11-09 15:40:22

标签: performance vba io

我想知道这两个代码之间是否存在性能差异:

Open strFile For Output As #fNum
For var1 = 1 to UBound(strvar1)
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          Print #fNum texte
        Next var4
     Next var3
   Next var2
Next var1
Close #fNum

并且

For var1 = 1 to UBound(strvar1)
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          texteTotal = texteTotal  +  texte
        Next var4
     Next var3
   Next var2
Next var1

Open strFile For Output As #fNum
    Print #fNum texteTotal 
Close #fNum

万一,循环很大?

5 个答案:

答案 0 :(得分:3)

您必须尝试,因为它取决于texte的大小。

每次执行texteTotal = texteTotal + texte时,vba都会制作textTotal的新副本。随着textTotal变得越来越大,你的循环将变慢。

您还冒着创建大于vba可以处理的字符串的风险。

所以:

如果您正在写入网络驱动器,并且texte是单个字符,则第二种方法可能会更好。

如果您要写入快速本地光盘,并且texte是64kb,并且每个数组都是1M条目,则第一种方法会更好。

答案 1 :(得分:3)

答案 2 :(得分:0)

我认为最大的区别在于您打开文件的时间。

在第二种情况下,我会假设它会在较短的时间内打开,更好,因为你应该只在最短的时间内锁定资源。

答案 3 :(得分:0)

Cody非常感谢你的时间。 以下是一些信息:代码示例#1是当前的生产代码。更确切地说,这是整个过程的一部分

1)从DB#1获取信息

2)用数学公式(矩阵,向量)计算,N = BIG

3)将结果复制到每个txt文件(10 k lignes +)。

4)要插入数据库的psql查询

5)恢复原状我想知道与psql插入相比,复制到txt文件是否真的必要且成本高昂?我喜欢你构建自定义字符串类的想法,你认为它可以超越I / O性能吗?

答案 4 :(得分:0)

最近我遇到了这个问题,我正在向网络文件写入大量文本(~100k行)。当每个Print命令创建I / O活动时,写入文件的过程非常慢。但是,通过将新行连接到它来创建一个大字符串也被证明非常慢,正如其他答案中所解释的那样。

我通过将各行写入缓冲区数组,然后将此数组连接到一个字符串,然后立即写入该文件,解决了这个问题。 根据您的示例,它将类似于:

Dim buffer() as Variant
Dim i as Long
i = 1
ReDim buffer(1 to Ubound(strvar1) * Ubound(strvar2) * Ubound(strvar3) * Ubound(strvar4)
For var1 = 1 to UBound(strvar1) 
  For var2 = 1 to UBound(strvar2)
     For var3 = 1 to UBound(strvar3)
        For var4 = 1 to UBound(strvar4)
          buffer(i) = texte
          i = i + 1
        Next var4
     Next var3
   Next var2
Next var1
Open strFile For Output As #fNum
Print #fNum Join(buffer, vbCrLf)
Close #fNum

这可以防止增量连接的开销(连接函数与行数呈线性关系,而不是连接的指数),以及将多行单独写入网络文件的I / O开销。 / p>