找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 181|回复: 0

【干货】高精度计时,用于程序算法调试

[复制链接]

27

主题

11

回帖

151

积分

管理员

积分
151
发表于 2024-4-6 00:05:22 | 显示全部楼层 |阅读模式
写程序的时候,尤其是算法类的,需要比对算法执行时间。这个代码集合了一些高手的经验



  1. ' 大整数结构体
  2. Private Type LARGE_INTEGER
  3.     LowPart As Long
  4.     HighPart As Long
  5. End Type

  6. ' 获取时间计数器计数值
  7. Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long

  8. ' 获取震动频率:一个大整数
  9. Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long

  10. ' 用于将大整数的字节复制到Currency类型,完成转换的工作
  11. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

  12. ' 初始时间
  13. Private initTime As LARGE_INTEGER

  14. ' 每秒震动次数
  15. Private freqCount As LARGE_INTEGER

  16. ' 采样时振动器震动计数值
  17. Private logTime As LARGE_INTEGER

  18. ' 每秒震动次数的Currency类型数据
  19. Private fFreq As Currency

  20. ' 将一个长整型转换成高精度型数据
  21. Private Function LargeIntToCurrency(liInput As LARGE_INTEGER) As Currency
  22.     CopyMemory LargeIntToCurrency, liInput, LenB(liInput)
  23.     LargeIntToCurrency = LargeIntToCurrency * 10000
  24. End Function

  25. ' 类初始化
  26. Private Sub Class_Initialize()
  27.     ' 获取振荡器的震荡频率
  28.     If QueryPerformanceFrequency(freqCount) > 0 Then
  29.         If QueryPerformanceCounter(initTime) > 0 Then
  30.         Else
  31.             Err.Raise 11, , "记录震荡次数出错!"
  32.         End If
  33.     Else
  34.         Err.Raise 11, , "读取震荡频率出错!"
  35.     End If
  36.     fFreq = LargeIntToCurrency(freqCount)
  37. End Sub

  38. ' 重置计数器
  39. Public Sub ReInit()
  40.     Call Class_Initialize
  41. End Sub

  42. ' 重置计数器,并返回从上次重置计数器开始共流失的秒数。
  43. Public Function ReInitGet() As Currency
  44.     Dim cuStart As Currency
  45.     Dim cuEnd As Currency
  46.     QueryPerformanceCounter logTime
  47.     cuStart = LargeIntToCurrency(initTime)
  48.     cuEnd = LargeIntToCurrency(logTime)
  49.     ReInitGet = (cuEnd - cuStart) / fFreq
  50.     QueryPerformanceCounter initTime
  51. End Function

  52. ' 返回从上次重置计数器开始共流失的秒数,但不重置计数器
  53. Public Function SmoothGet() As Currency
  54.     Dim cuStart As Currency
  55.     Dim cuEnd As Currency
  56.     QueryPerformanceCounter logTime
  57.     cuStart = LargeIntToCurrency(initTime)
  58.     cuEnd = LargeIntToCurrency(logTime)
  59.     SmoothGet = (cuEnd - cuStart) / fFreq
  60. End Function
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|编程客 ( 鄂ICP备19023849号-1 )

GMT+8, 2025-6-13 08:33 , Processed in 0.031910 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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