|
其实做个实验就知道了。由于 combo1.additem records![Full Name] 这句本身对测试速度没什么影响,两种方法执行这一句效率相同。
所以问题可以简单为 for i=1 to iRecordCount 快还是 do while not rs.eof 快
我也比较好奇,第一次听到这种说法,所以做了个简单的测试如下。
测试步骤:
1. 新建一空z.mdb文件, 关闭系统所有无关应用程序,打开 taskmgr.exe以便监控CPU和内存.
2. 打开z.mdb并新建一模块。 输入代码如下。
Option Compare Database
Option Explicit
Public Sub c() '建立测试环境,建一表test,有10,000条记录。
Dim sSQL As String
sSQL = "create table test(id integer constraint pk_test primary key,c varchar(30))"
CurrentProject.Connection.Execute sSQL
Dim i As Integer
For i = 1 To 10000
sSQL = "insert into test values (" & i & ",'" & Format(i, "000000") & "')"
CurrentProject.Connection.Execute sSQL
Next i
End Sub
Public Sub t1()
Dim rs As New ADODB.Recordset
Dim sSQL As String
Dim iRecCount As Long
Dim stemp As String
Dim i As Integer
sSQL = "select c from test"
rs.Open sSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly
' 记录集为readonly时无法支持recordcount属性。因此只能用Static,
iRecCount = rs.RecordCount
For i = 1 To iRecCount
stemp = rs.Fields(0).Value
rs.MoveNext
Next i
rs.Close
Set rs = Nothing
End Sub
Public Sub t2()
Dim rs As New ADODB.Recordset
Dim sSQL As String
Dim stemp As String
sSQL = "select c from test"
rs.Open sSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
Do While Not rs.EOF()
stemp = rs.Fields(0).Value
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Public Sub tt1() '测试调用t1
Dim i As Integer
Debug.Print Now, "test recordcount started ..."
For i = 1 To 100
t1
Next i
Debug.Print Now, "test recordcount accomplished ..."
End Sub
Public Sub tt2() '测试调用t2
Dim i As Integer
Debug.Print Now, "test EOF() started ..."
For i = 1 To 100
t2
Next i
Debug.Print Now, "test EOF() accomplished ..."
End Sub
3. 运行tt1(),tt2(),tt2(),tt1() 交替一下顺序以避免先后次序对测试的影响, 结果如下
3/29/2009 6:06:21 PM test recordcount started ...
3/29/2009 6:06:32 PM test recordcount accomplished ...
3/29/2009 6:06:35 PM test EOF() started ...
3/29/2009 6:06:41 PM test EOF() accomplished ...
3/29/2009 6:06:46 PM test EOF() started ...
3/29/2009 6:06:52 PM test EOF() accomplished ...
3/29/2009 6:06:55 PM test recordcount started ...
3/29/2009 6:07:06 PM test recordcount accomplished ...
结论: (windows 2000 sp4 + access 2003 sp3, CPU 2GHz, MEM 2GB)
在对10000记录的 1000次循环中
eof 耗时为约 6s, recordcount 耗时为约 11s
如果将eof的记录集方式也换成 adOpenStatic 即在 t2()中改成如下
rs.Open sSQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly
则测试结果
3/29/2009 6:07:45 PM test recordcount started ...
3/29/2009 6:07:56 PM test recordcount accomplished ...
3/29/2009 6:08:01 PM test EOF() started ...
3/29/2009 6:08:11 PM test EOF() accomplished ...
3/29/2009 6:08:15 PM test EOF() started ...
3/29/2009 6:08:26 PM test EOF() accomplished ...
3/29/2009 6:08:29 PM test recordcount started ...
3/29/2009 6:08:40 PM test recordcount accomplished ...
测试数据表明两者无明显差异。
![]()
******************
* 一切皆有可能 *
******************
.
ACMAIN - Access论坛回贴准则(个人).
.
同一贴子不回复第二次
|
|