VB6:缓慢的二进制写入?

VB6:缓慢的二进制写入?,vb6,binary,io,Vb6,Binary,Io,想知道为什么VB中的某个二进制写操作如此缓慢。函数从内存中读取字节数组,并将其转储到如下文件中: Open Destination For Binary Access Write As #1 Dim startP, endP As Long startP = BinaryStart endP = UBound(ReadBuf) - 1 Dim i as Integer For i = startP To endP DoEvents Put #1, (i - BinarySt

想知道为什么VB中的某个二进制写操作如此缓慢。函数从内存中读取字节数组,并将其转储到如下文件中:

Open Destination For Binary Access Write As #1

Dim startP, endP As Long
startP = BinaryStart
endP = UBound(ReadBuf) - 1
Dim i as Integer

For i = startP To endP

    DoEvents
    Put #1, (i - BinaryStart) + 1, ReadBuf(i)

Next

Close #1
对于速度较慢的系统上的两兆字节,这可能需要一分钟的时间。谁能告诉我为什么这么慢


编辑:选择VB6的原因是,它作为一个EXE在100%的目标平台上运行,没有任何独立的依赖项(除了VBRUN,它几乎在所有平台上运行)。

那么,您是在逐个读取和写入每个字节吗?在这种情况下,您将遍历200万个元素,而不是一次只获取一块数据并将其写入流。

那么,您是在逐个读取和写入每个字节吗?在这种情况下,您将遍历200万个元素,而不是一次只获取一块数据并将其写入流。

执行DoEvents调用。如果您每次写入一个字节的两兆数据,则该循环有2097152个DoEvents调用。这真的会减慢进程。

取消DoEvents呼叫。如果您每次写入一个字节的两兆数据,则该循环有2097152个DoEvents调用。这真的会减慢进程。

Dim startP,endP As Long
--这里您将
startP
声明为
Variant
endP
声明为
Long

DoEvents
——将控制权交给操作系统,每次迭代调用都会使几乎任何循环都无穷无尽

然后,如果你想把数组的一部分保存到一个文件中,那应该是

嗯。。。那应该是什么呢


选项1。

声明另一个数组来保存片段,
CopyMemory
将数据放入其中,并使用单个
put
将其放入文件:

Put #1, , arrName
然而,这可能不是明智的记忆明智


因此,选项2

创建一个数组,该数组引用大数组中的数据。这样,将不会两次分配任何内容:

  Dim bigArray(1 To 1000) As Byte
  Dim chunk() As Byte
  Dim i As Long

  'Filling the array for test purposes
  For i = LBound(bigArray) To UBound(bigArray)
    bigArray(i) = Rnd * 254
  Next

  'Create an array that refers to 100 bytes from bigArray, starting from 500th
  CreateSAFEARRAY ArrPtr(chunk), 1, VarPtr(bigArray(500)), 1, 100

  Open "c:\1.txt" For Binary Access Write As #1
  Put #1, , chunk
  Close #1

  'Always destroy it manually!
  DestroySAFEARRAY ArrPtr(chunk)
此代码需要以下帮助函数(放在单独的模块中):

选项显式
私有声明函数SafeArrayAllocDescriptor Lib“oleaut32”(ByVal cDims尽可能长,ppsaOut尽可能长)
私有声明函数SafeArrayDestroyDescriptor Lib“oleaut32”(psa如有)的长度为
公共声明函数GetMem4 Lib“msvbvm60”(ByVal pSrc为Long,ByVal pDst为Long)为Long
公共声明函数PutMem4 Lib“msvbvm60”(ByVal pDst为Long,ByVal NewValue为Long)为Long
公共声明函数PutMem8 Lib“msvbvm60”(ByVal pDst为Long,ByVal NewValueLow为Long,ByVal NewValueHigh为Long)为Long
私有常量S_正常,只要长度=0
公共声明函数ArrPtr Lib“msvbvm60”别名“VarPtr”(arr()如有),长度为
公共函数CreateSAFEARRAY(ByVal ppBlankArr为Long,ByVal ElemSize为Long,ByVal pData为Long,paramary Bounds())为Long
我想我会坚持多久
如果(UBound(Bounds)-LBound(Bounds)+1)Mod 2,则错误提升5,“安全数组”,“边界必须包含偶数个条目。”
如果SafeArrayAllocDescriptor((UBound(Bounds)-LBound(Bounds)+1)/2,ByVal ppBlankArr)正常,则出现错误5
GetMem4 ppBlankArr,VarPtr(CreateSAFEARRAY)
PutMem4 CreateSAFEARRAY+4,ElemSize
PutMem4 CreateSAFEARRAY+12,pData
对于i=LBound(边界)到UBound(边界)-1步骤2
如果边界(i+1)-边界(i)+1>0,则
PutMem8 CreateSAFEARRAY+16+(UBound(Bounds)-i-1)*4,Bounds(i+1)-Bounds(i)+1,Bounds(i)
其他的
SafeArrayDestroyDescriptor ByVal CreateSAFEARRAY
CreateSAFEARRAY=0
PutMem4 ppBlankArr,0
错误5,“每个维度必须至少包含1个元素”
如果结束
下一个
端函数
公共函数数组(ByVal ppArray长度)长度相同
GetMem4 pArray,VarPtr(安全阵列)
如果SafeArrayDestroyDescriptor(ByVal DestroySAFEARRAY)S_OK,则错误提示5
PutMem4 pArray,0
数组=0
端函数

Dim-startP,endP-As-Long
——在这里,您将
startP
声明为
Variant
endP
声明为
Long

DoEvents
——将控制权交给操作系统,每次迭代调用都会使几乎任何循环都无穷无尽

然后,如果你想把数组的一部分保存到一个文件中,那应该是

嗯。。。那应该是什么呢


选项1。

声明另一个数组来保存片段,
CopyMemory
将数据放入其中,并使用单个
put
将其放入文件:

Put #1, , arrName
然而,这可能不是明智的记忆明智


因此,选项2

创建一个数组,该数组引用大数组中的数据。这样,将不会两次分配任何内容:

  Dim bigArray(1 To 1000) As Byte
  Dim chunk() As Byte
  Dim i As Long

  'Filling the array for test purposes
  For i = LBound(bigArray) To UBound(bigArray)
    bigArray(i) = Rnd * 254
  Next

  'Create an array that refers to 100 bytes from bigArray, starting from 500th
  CreateSAFEARRAY ArrPtr(chunk), 1, VarPtr(bigArray(500)), 1, 100

  Open "c:\1.txt" For Binary Access Write As #1
  Put #1, , chunk
  Close #1

  'Always destroy it manually!
  DestroySAFEARRAY ArrPtr(chunk)
此代码需要以下帮助函数(放在单独的模块中):

选项显式
私有声明函数SafeArrayAllocDescriptor Lib“oleaut32”(ByVal cDims尽可能长,ppsaOut尽可能长)
私有声明函数SafeArrayDestroyDescriptor Lib“oleaut32”(psa如有)的长度为
公共声明函数GetMem4 Lib“msvbvm60”(ByVal pSrc为Long,ByVal pDst为Long)为Long
公共声明函数PutMem4 Lib“msvbvm60”(ByVal pDst为Long,ByVal NewValue为Long)为Long
公共声明函数PutMem8 Lib“msvbvm60”(ByVal pDst为Long,ByVal NewValueLow为Long,ByVal NewValueHigh为Long)为Long
私有常量S_正常,只要长度=0
公共声明函数ArrPtr Lib“msvbvm60”别名“VarPtr”(arr()如有),长度为
公共函数CreateSAFEARRAY(ByVal ppBlankArr为Long,ByVal ElemSize为Long,ByVal pData为Long,paramary Bounds())为Long
我想我会坚持多久
如果(UBound(Bounds)-LBound(Bounds)+1)Mod 2,则错误提升5,“安全数组”,“边界必须包含偶数个条目。”
如果SafeArrayAllocDescriptor((UBound(Bounds)-LBound(Bounds)+1)/2,ByVal ppBlankArr)正常,则出现错误5
GetMem4 ppBlankArr,VarPtr(CreateSAFEARRAY)
PutMem4 CreateSAFEARRAY+4,ElemSize
PutMem4 CreateSAFEARRAY+12,pData