Office中国论坛/Access中国论坛

标题: Access 速度大比拼 [打印本页]

作者: 海狸先生    时间: 2005-8-14 18:41
标题: Access 速度大比拼
1、If  then 语句比 iif 函数 快 6倍 左右

2、Left$(string, 1)比Mid$(string, 1, 1) 快 40%左右(Right$也一样)

3、判断空字符串 Len("") = 0比"" = "" 快 2.6倍左右

4、id = 9 \ 4 比id = Int(9 / 4) 快 4.5倍,注意 \  是整除

5、Do Until rs.EOF

k = k + 1

rs.MoveNext

<st1:place w:st="on">Loop</st1:place>



--------------------------------------

kk = rs.RecordCount

For i = 1 To kk

k = k + 1

rs.MoveNext

Next







注:rs 的记录有 1234567条

Do 循环比 For 循环速度慢了 20%

[此贴子已经被作者于2005-8-14 10:48:58编辑过]


作者: eyewitnes    时间: 2005-8-14 18:45
呃?看来以后要多用for了
作者: zyp    时间: 2005-8-14 19:28
收下,谢谢!2。用mid$()是不得已,因为要得到字符串中间的字符,总不能将left$()和right$()结合起来用吧。5。我一直用的是do循环,以后改为FOR试试。另外请教版主,测试一个代码的运行速度,且精确到毫秒,用什么方法?谢谢!
作者: LucasLynn    时间: 2005-8-14 19:36
http://www.office-cn.net/BBS/dispbbs.asp?boardID=2&ID=30847&page=1看看这个帖子,还有速度更强的。
作者: 海狸先生    时间: 2005-8-14 20:55
1、Private Declare Function GetTickCount Lib "kernel32" () As Long

2、Private Declare Function timeGetTime Lib "winmm.dll" () As Long

3 Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long以上三个都可以,但是1和2据资料所说,只能精确到10毫秒以下是转载网上:虽然timeGetTime返回值的单位是1ms,但实际上它的精度只有10ms左右。

    如果想提高精度,可以使用QueryPerformanceCounter和QueryPerformanceFrequency。这两个函数不是在每个系统中都支持。对于支持它们的系统中,可以获得低于1ms的精度。Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。根据要延时的时间和定时器的频率, 可以算出要延时的时间定时器经过的周期数。在循环里用 QueryPerformanceCounter 不停的读出定时器值, 一直到经过了指定周期数再结束循环, 就达到了高精度延时的目的。例如:

    Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long

     

    ' DelayNum为延时的毫秒数

    Private Sub DelayTime(ByVal DelayNum As Long)

     Dim Ctr1, Ctr2, Freq As Currency

     Dim Count As Double

     

     If QueryPerformanceFrequency(Freq) Then

     QueryPerformanceCounter Ctr1

     Do

     QueryPerformanceCounter Ctr2

     Loop While (Ctr2 - Ctr1) / Freq * 1000 < DelayNum

     Else

     MsgBox "不支持高精度计数器!"

     End If

    End Sub

   


    不过,Windows不是实时操作系统,如果任务太多,或者有其他中断请求,都可能导致程序运行时的延迟不精确,一般的Windows程序也可以接受。如果你对时间精度要求很高,一般只有使用Windows的实时扩展RTX,或者使用其他实时操作系统,如VXWorks等。
作者: zyp    时间: 2005-8-15 01:28
谢谢海狸版主,这些代码需要好好消化一下。[em17][em17][em17][em17][em17]
作者: wu8313    时间: 2005-8-15 04:50
谢谢 海狸先生 的指导。说实在的,我从来没有考虑过速度的问题,能够把想要的东西整理出来就算不错了,总是东拼西凑一番。还没法到达这个境界去关心速度等等,不过我会因此有了一点认识。
作者: 中国人    时间: 2005-8-15 21:14
海狸兄弟真的是有心,测代码的运行速度,从没想过哟!
作者: cjls2000    时间: 2005-8-15 22:33
我强烈支持  我正需要啊:)
作者: LucasLynn    时间: 2005-8-18 18:38
以下是引用海狸先生在2005-8-14 12:55:00的发言:



1、Private Declare Function GetTickCount Lib "kernel32" () As Long

2、Private Declare Function timeGetTime Lib "winmm.dll" () As Long



3 Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long

以上三个都可以,但是1和2据资料所说,只能精确到10毫秒

以下是转载网上:

虽然timeGetTime返回值的单位是1ms,但实际上它的精度只有10ms左右。

    如果想提高精度,可以使用QueryPerformanceCounter和QueryPerformanceFrequency。这两个函数不是在每个系统中都支持。对于支持它们的系统中,可以获得低于1ms的精度。Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。根据要延时的时间和定时器的频率, 可以算出要延时的时间定时器经过的周期数。在循环里用 QueryPerformanceCounter 不停的读出定时器值, 一直到经过了指定周期数再结束循环, 就达到了高精度延时的目的。例如:

    Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long

    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long

     

    ' DelayNum为延时的毫秒数

    Private Sub DelayTime(ByVal DelayNum As Long)

     Dim Ctr1, Ctr2, Freq As Currency

     Dim Count As Double

     

     If QueryPerformanceFrequency(Freq) Then

     QueryPerformanceCounter Ctr1

     Do

     QueryPerformanceCounter Ctr2

     Loop While (Ctr2 - Ctr1) / Freq * 1000 < DelayNum

     Else

     MsgBox "不支持高精度计数器!"

     End If

    End Sub

   


    不过,Windows不是实时操作系统,如果任务太多,或者有其他中断请求,都可能导致程序运行时的延迟不精确,一般的Windows程序也可以接受。如果你对时间精度要求很高,一般只有使用Windows的实时扩展RTX,或者使用其他实时操作系统,如VXWorks等。

补充一下,系统的最高计时精度为1/CPU主频,200MHz的CPU能提供的最大计时精度为5纳秒。
作者: eyewitnes    时间: 2005-8-19 17:42
俺今天刚好手上有段代码,做了个10W条以上记录的测试,怎么发现for...next的比do until的要慢呀?不过俺发现最快的还是用SQL语句, 3.2523148148148E-08 是用DO UNTIL循环的时间, 8.10185185185497E-10 是用SQL语句的时间,当然,俺知道这个时间应该是不准确的,但是自己感觉上,用SQL语句快了有5到6倍,所以俺以后如果能用SQL语句解决的就绝对不用循环做了

[attach]12550[/attach]这个是我测试的例子



[此贴子已经被作者于2005-8-19 10:11:44编辑过]


作者: myhome810    时间: 2006-4-19 23:16
请教各位高手,我用Access2000做的数据库系统,当连续使用运行3、4小时时就会出错,并提示“内存溢出”。数所库中的用代码编写,也有用宏的。不知是什么问题????
作者: t小宝    时间: 2006-4-22 01:14
在代码中看来IIF函数是不能用了
作者: stzerozone    时间: 2006-4-22 06:23
天才

天才

都是天才

小弟算是长见识了


作者: zxwgc    时间: 2006-4-23 20:44
学习
作者: sy_chenhu    时间: 2006-9-11 17:48
高,实在高
作者: jqm288    时间: 2006-9-27 16:59
我强烈支持  我也正需要啊:)
作者: james_chung    时间: 2006-9-29 19:08
对头
作者: james_chung    时间: 2006-9-29 19:08
楼主还有其它经验交予我们吗?期待中


作者: chaojianan    时间: 2009-4-19 16:47
慢慢消化。
作者: dxy27    时间: 2009-4-24 13:29
噢,明白了
作者: chaojianan    时间: 2009-10-24 15:42
看看,以后得注意速度啦。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3