设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 9178|回复: 21
打印 上一主题 下一主题

[Access本身] Access 速度大比拼

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-14 18:41:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-8-14 18:45:00 | 只看该作者
呃?看来以后要多用for了
3#
发表于 2005-8-14 19:28:00 | 只看该作者
收下,谢谢!2。用mid$()是不得已,因为要得到字符串中间的字符,总不能将left$()和right$()结合起来用吧。5。我一直用的是do循环,以后改为FOR试试。另外请教版主,测试一个代码的运行速度,且精确到毫秒,用什么方法?谢谢!
4#
发表于 2005-8-14 19:36:00 | 只看该作者
http://www.office-cn.net/BBS/dispbbs.asp?boardID=2&ID=30847&page=1看看这个帖子,还有速度更强的。
5#
 楼主| 发表于 2005-8-14 20: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等。
6#
发表于 2005-8-15 01:28:00 | 只看该作者
谢谢海狸版主,这些代码需要好好消化一下。[em17][em17][em17][em17][em17]
7#
发表于 2005-8-15 04:50:00 | 只看该作者
谢谢 海狸先生 的指导。说实在的,我从来没有考虑过速度的问题,能够把想要的东西整理出来就算不错了,总是东拼西凑一番。还没法到达这个境界去关心速度等等,不过我会因此有了一点认识。
8#
发表于 2005-8-15 21:14:00 | 只看该作者
海狸兄弟真的是有心,测代码的运行速度,从没想过哟!
9#
发表于 2005-8-15 22:33:00 | 只看该作者
我强烈支持  我正需要啊:)
10#
发表于 2005-8-18 18:38:00 | 只看该作者
以下是引用海狸先生在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纳秒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-21 19:44 , Processed in 0.105548 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表