65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.16/5 (7投票s)

2007年10月17日

2分钟阅读

viewsIcon

28406

downloadIcon

187

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

Slow Memory Main Screen

引言

你敢相信吗,写入(连接到内存)的速度比写入磁盘慢(慢100倍)? 好的,这个 VB 6 程序证明了在 VB6 虚拟机下,它的速度慢得多。

背景

在尝试确定我收到一个 VB6 程序为什么如此缓慢时,我偶然发现了一行如下代码:

strFileData = strFileData & strMoreFiledata

该行代码所做的只是连接到一个 VB 字符串(BString),因此不应该慢。 但是,当你更多地了解 VB 字符串的存储方式(作为 BString)时,你会发现 BString 的最大大小为 65535(2 字节整数)。

因此,每当字符串变得大于该值时,系统就必须每次连接到字符串时都执行 malloc。

Using the Code

获取源代码并使用 Visual Basic 6 打开或直接运行提供的可执行文件。

只有两个按钮

  • 连接字符串按钮
    1. 打开文件,写入开始时间,关闭文件
    2. 将连接到字符串 1,000,0000 次
    3. 打开文件,写入结束时间,关闭文件
    4. 小心,在现代硬件上需要 18 或 19 分钟
  • 连接文件按钮
    1. 打开文件 #1,写入开始时间,关闭文件
    2. 打开文件 #2(连接文件)
    3. 将连接到文件 (#2) 1,000,0000 次
    4. 关闭文件 #2
    5. 打开文件 #1,写入结束时间,关闭文件 #1
    6. 仅需 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

运行后

运行后,如果你点击了每个按钮,你将总共有三个文件。

  1. c:\VBStringTime.txt -- 包含过程的开始和停止时间
  2. c:\VBFileTime.txt -- 包含过程的开始和停止时间
  3. 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 秒的范围内! 什么???

结论

事情并不总是表面上看起来的那样。 获取代码并运行它,你将会大吃一惊。

© . All rights reserved.