当内存写入比磁盘写入慢时






1.16/5 (7投票s)
2007年10月17日
2分钟阅读

28406

187
什么时候内存写入比磁盘写入慢?当是 VB 6 时。

引言
你敢相信吗,写入(连接到内存)的速度比写入磁盘慢(慢100倍)? 好的,这个 VB 6 程序证明了在 VB6 虚拟机下,它的速度慢得多。
背景
在尝试确定我收到一个 VB6 程序为什么如此缓慢时,我偶然发现了一行如下代码:
strFileData = strFileData & strMoreFiledata
该行代码所做的只是连接到一个 VB 字符串(BString
),因此不应该慢。 但是,当你更多地了解 VB 字符串的存储方式(作为 BString
)时,你会发现 BString
的最大大小为 65535(2 字节整数)。
因此,每当字符串变得大于该值时,系统就必须每次连接到字符串时都执行 malloc。
Using the Code
获取源代码并使用 Visual Basic 6 打开或直接运行提供的可执行文件。
只有两个按钮
- 连接字符串按钮
- 打开文件,写入开始时间,关闭文件
- 将连接到字符串 1,000,0000 次
- 打开文件,写入结束时间,关闭文件
- 小心,在现代硬件上需要 18 或 19 分钟
- 连接文件按钮
- 打开文件 #1,写入开始时间,关闭文件
- 打开文件 #2(连接文件)
- 将连接到文件 (#2) 1,000,0000 次
- 关闭文件 #2
- 打开文件 #1,写入结束时间,关闭文件 #1
- 仅需 1-2 秒
这是整个代码列表,因为它非常短
Private Sub cmdConcatString_Click()
Dim str As String
Open "c:\VBStringTime.txt" For Append As #1
Write #1, "####### START #######"
Write #1, Now()
Close #1
For x = 1 To 1000000
str = str & "A"
Next x
Open "c:\VBStringTime.txt" For Append As #1
Write #1, "####### END #######"
Write #1, Now()
Close #1
End Sub
Private Sub cmdConcatToFile_Click()
Dim str As String
Open "c:\VBFileTime.txt" For Append As #1
Write #1, "###### START #####"
Write #1, Now()
Close #1
str = "A"
Open "c:\VBFileConcat.txt" For Append As #2
For x = 1 To 1000000
Write #2, str
Next x
Close #2
Open "c:\VBFileTime.txt" For Append As #1
Write #1, "###### End #####"
Write #1, Now()
Close #1
End Sub
运行后
运行后,如果你点击了每个按钮,你将总共有三个文件。
- c:\VBStringTime.txt -- 包含过程的开始和停止时间
- c:\VBFileTime.txt -- 包含过程的开始和停止时间
- c:\VBFileConcat.txt -- 包含写入文件 A 的字符串
花费的时间
字符串连接(内存)
这是 VBStringTime.txt 显示的内容
"####### START #######"
#2007-10-03 13:59:25#
"####### END #######"
#2007-10-03 14:18:13#
没错。 执行 1,000,000 次内存连接几乎需要 19 分钟!
文件连接(磁盘)
"###### START #####"
#2007-10-03 14:14:39#
"###### End #####"
#2007-10-03 14:14:40#
没错。 大约在 1 到 2 秒的范围内! 什么???
结论
事情并不总是表面上看起来的那样。 获取代码并运行它,你将会大吃一惊。