我想知道这两个代码之间是否存在性能差异:
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
万一,循环很大?
答案 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>