关于vfp声明api函数的小发现

1 篇文章 0 订阅
前不久偶然看到了 dkfdtf 版主N久前发的一个贴子,这里做了在没有动摇根本的情况下做了少许修改并加以说明
测试环境 Win xp sp3 + vfp 9.0 sp2 7423 + 1G内存 + 闪龙 3000+ CPU

1.先看测试代码

CLEAR
CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In WIN32API
ENDFOR
? 'win32api', SECONDS() - m.nStart

CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In user32
ENDFOR
? 'user32.dll', SECONDS() - m.nStart

运行这段代码发现,这两种声明api函数的方式竟然有如此大的速率差异
为什么会有如此大的差异 ?
2. 再看看这段测试代码

CLEAR
CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In WIN32API
    GetDesktopWindow()
ENDFOR
? 'win32api', SECONDS() - m.nStart

CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In user32
    GetDesktopWindow()
ENDFOR
? 'user32.dll', SECONDS() - m.nStart

注:执行这段代码的时候vfp会出错,但并不影响结果
结果发现,调用api函数用的时间几乎是相同的,并且极短极短
3. 再看一下分开执行时操作系统都干了什么
这里借助了微软的 Procmon 工具

CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In WIN32API
ENDFOR
? 'win32api', SECONDS() - m.nStart

35707    13:37:53.7541662    vfp9.exe    3080    进程剖析        成功    用户时间: 3.0625000, 内核时间: 7.7343750, 私有字节: 7,008,256, 工作集: 13,340,672
35760    13:37:54.7744738    vfp9.exe    3080    进程剖析        成功    用户时间: 3.0781250, 内核时间: 7.7343750, 私有字节: 7,008,256, 工作集: 13,340,672
35808    13:37:55.7673006    vfp9.exe    3080    进程剖析        成功    用户时间: 3.0781250, 内核时间: 7.7343750, 私有字节: 7,008,256, 工作集: 13,340,672
35856    13:37:56.4924458    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\pro1.prg    不允许快速IO    
35857    13:37:56.4925430    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.prg    成功    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a, 打开结果: 已打开
35858    13:37:56.4927062    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.prg    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:48:43, 最后访问时间: 2012-3-9 13:35:27, 上次写入时间: 2012-3-9 13:35:28, 更改时间: 2012-3-9 13:35:27, 文件属性: A
35859    13:37:56.4927718    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.prg    成功    
35860    13:37:56.4927905    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1\pro1.prg    成功    
35861    13:37:56.4928230    vfp9.exe    3080    IRP_MJ_CREATE    D:\    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35862    13:37:56.4928626    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1    成功    Type: 查询目录, 过滤器: test1, 2: test1
35863    13:37:56.4928939    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\    成功    
35864    13:37:56.4929090    vfp9.exe    3080    IRP_MJ_CLOSE    D:\    成功    
35865    13:37:56.4929917    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35866    13:37:56.4930319    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
35867    13:37:56.4930590    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
35868    13:37:56.4930735    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
35869    13:37:56.4990838    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35870    13:37:56.4991542    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.prg    成功    Type: 查询目录, 过滤器: pro1.prg, 2: pro1.prg
35871    13:37:56.4991972    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
35872    13:37:56.4992129    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
35873    13:37:56.4993657    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.FXP    成功    访问期望: 正常读取, 安排: 打开, 选项: 同步 IO 无提示, 非目录文件, 属性: N, 共享模式: 读取, 分配的大小: n/a, 打开结果: 已打开
35874    13:37:56.4994204    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询标准信息-文件, 分配的大小: 352, 文件末尾: 347, 链接数: 1, 删除被挂起: 假, 目录: 假
35875    13:37:56.4994372    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:49:24, 最后访问时间: 2012-3-9 13:36:04, 上次写入时间: 2012-3-9 13:36:06, 更改时间: 2012-3-9 13:36:04, 文件属性: A
35876    13:37:56.4995453    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\pro1.prg    不允许快速IO    
35877    13:37:56.4996261    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.prg    成功    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a, 打开结果: 已打开
35878    13:37:56.4997747    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.prg    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:48:43, 最后访问时间: 2012-3-9 13:35:27, 上次写入时间: 2012-3-9 13:35:28, 更改时间: 2012-3-9 13:35:27, 文件属性: A
35879    13:37:56.4998381    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.prg    成功    
35880    13:37:56.4998557    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1\pro1.prg    成功    
35881    13:37:56.4998856    vfp9.exe    3080    IRP_MJ_CREATE    D:\    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35882    13:37:56.4999222    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1    成功    Type: 查询目录, 过滤器: test1, 2: test1
35883    13:37:56.4999510    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\    成功    
35884    13:37:56.4999652    vfp9.exe    3080    IRP_MJ_CLOSE    D:\    成功    
35885    13:37:56.5000381    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35886    13:37:56.5000758    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
35887    13:37:56.5001021    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
35888    13:37:56.5001163    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
35889    13:37:56.5001965    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35890    13:37:56.5002340    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.prg    成功    Type: 查询目录, 过滤器: pro1.prg, 2: pro1.prg
35891    13:37:56.5002647    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
35892    13:37:56.5002789    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
35893    13:37:56.5003717    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
35894    13:37:56.5004094    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
35895    13:37:56.5004384    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
35896    13:37:56.5006779    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
35897    13:37:56.5007175    vfp9.exe    3080    IRP_MJ_READ    D:\test1\pro1.FXP    成功    偏移量: 0, 长度: 347
35899    13:37:56.5007891    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:49:24, 最后访问时间: 2012-3-9 13:36:04, 上次写入时间: 2012-3-9 13:36:06, 更改时间: 2012-3-9 13:36:04, 文件属性: A
35900    13:37:56.5008139    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询标准信息-文件, 分配的大小: 352, 文件末尾: 347, 链接数: 1, 删除被挂起: 假, 目录: 假
35901    13:37:56.5008312    vfp9.exe    3080    FASTIO_READ    D:\test1\pro1.FXP    成功    偏移量: 41, 长度: 306
35902    13:37:56.5328289    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.FXP    成功    
35934    13:37:56.7444695    vfp9.exe    3080    进程剖析        成功    用户时间: 3.0937500, 内核时间: 7.7812500, 私有字节: 7,008,256, 工作集: 13,340,672

CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In user32
ENDFOR
? 'user32.dll', SECONDS() - m.nStart

189862    13:44:34.8075501    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\pro1.prg    不允许快速IO    
189863    13:44:34.8076445    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.prg    成功    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a, 打开结果: 已打开
189864    13:44:34.8077054    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.prg    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:48:43, 最后访问时间: 2012-3-9 13:42:36, 上次写入时间: 2012-3-9 13:42:38, 更改时间: 2012-3-9 13:42:36, 文件属性: A
189865    13:44:34.8077194    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.prg    成功    
189866    13:44:34.8077353    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1\pro1.prg    成功    
189867    13:44:34.8077669    vfp9.exe    3080    IRP_MJ_CREATE    D:\    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189868    13:44:34.8078035    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1    成功    Type: 查询目录, 过滤器: test1, 2: test1
189869    13:44:34.8078965    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\    成功    
189870    13:44:34.8079124    vfp9.exe    3080    IRP_MJ_CLOSE    D:\    成功    
189871    13:44:34.8079954    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189872    13:44:34.8081016    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
189873    13:44:34.8081329    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189874    13:44:34.8081477    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189875    13:44:34.8274311    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189876    13:44:34.8275121    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.prg    成功    Type: 查询目录, 过滤器: pro1.prg, 2: pro1.prg
189877    13:44:34.8275649    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189878    13:44:34.8275811    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189879    13:44:34.8277443    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.FXP    成功    访问期望: 正常读取, 安排: 打开, 选项: 同步 IO 无提示, 非目录文件, 属性: N, 共享模式: 读取, 分配的大小: n/a, 打开结果: 已打开
189880    13:44:34.8277996    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询标准信息-文件, 分配的大小: 248, 文件末尾: 241, 链接数: 1, 删除被挂起: 假, 目录: 假
189881    13:44:34.8278166    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:49:24, 最后访问时间: 2012-3-9 13:43:16, 上次写入时间: 2012-3-9 13:42:52, 更改时间: 2012-3-9 13:42:51, 文件属性: A
189882    13:44:34.8279262    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\pro1.prg    不允许快速IO    
189883    13:44:34.8280075    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\pro1.prg    成功    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a, 打开结果: 已打开
189884    13:44:34.8280468    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.prg    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:48:43, 最后访问时间: 2012-3-9 13:42:36, 上次写入时间: 2012-3-9 13:42:38, 更改时间: 2012-3-9 13:42:36, 文件属性: A
189885    13:44:34.8280589    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.prg    成功    
189886    13:44:34.8280737    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1\pro1.prg    成功    
189887    13:44:34.8281019    vfp9.exe    3080    IRP_MJ_CREATE    D:\    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189888    13:44:34.8281382    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1    成功    Type: 查询目录, 过滤器: test1, 2: test1
189889    13:44:34.8281667    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\    成功    
189890    13:44:34.8281812    vfp9.exe    3080    IRP_MJ_CLOSE    D:\    成功    
189891    13:44:34.8282539    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189892    13:44:34.8282916    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
189893    13:44:34.8285461    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189894    13:44:34.8285684    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189895    13:44:34.8287039    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189896    13:44:34.8287542    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.prg    成功    Type: 查询目录, 过滤器: pro1.prg, 2: pro1.prg
189897    13:44:34.8287911    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189898    13:44:34.8288059    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189899    13:44:34.8289076    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189900    13:44:34.8289467    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\pro1.PRG    成功    Type: 查询目录, 过滤器: pro1.PRG, 2: pro1.prg
189901    13:44:34.8289757    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189902    13:44:34.8289905    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189903    13:44:34.8290151    vfp9.exe    3080    IRP_MJ_READ    D:\test1\pro1.FXP    成功    偏移量: 0, 长度: 241
189905    13:44:34.8291213    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询基本信息-文件, 创建时间: 2012-3-7 15:49:24, 最后访问时间: 2012-3-9 13:43:16, 上次写入时间: 2012-3-9 13:42:52, 更改时间: 2012-3-9 13:42:51, 文件属性: A
189906    13:44:34.8291436    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    D:\test1\pro1.FXP    成功    Type: 查询标准信息-文件, 分配的大小: 248, 文件末尾: 241, 链接数: 1, 删除被挂起: 假, 目录: 假
189907    13:44:34.8291607    vfp9.exe    3080    FASTIO_READ    D:\test1\pro1.FXP    成功    偏移量: 41, 长度: 200
189908    13:44:34.8295420    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\user32.DLL    不允许快速IO    
189909    13:44:34.8296306    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\user32.DLL    名称未找到    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a
189910    13:44:34.8297521    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1    成功    访问期望: 读取数据/列出目录, 同步, 安排: 打开, 选项: 目录, 同步 IO 无提示, 属性: n/a, 共享模式: 读取, 写入, 分配的大小: n/a, 打开结果: 已打开
189911    13:44:34.8297965    vfp9.exe    3080    IRP_MJ_DIRECTORY_CONTROL    D:\test1\user32.DLL    无此文件    Type: 查询目录, 过滤器: user32.DLL
189912    13:44:34.8298230    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1    成功    
189913    13:44:34.8298384    vfp9.exe    3080    IRP_MJ_CLOSE    D:\test1    成功    
189914    13:44:34.8299504    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\Program Files\microsoft visual foxpro 9\user32.dll    不允许快速IO    
189915    13:44:34.8300108    vfp9.exe    3080    IRP_MJ_CREATE    D:\Program Files\microsoft visual foxpro 9\user32.dll    名称未找到    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a
189916    13:44:34.8301270    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    D:\test1\user32.dll    不允许快速IO    
189917    13:44:34.8302066    vfp9.exe    3080    IRP_MJ_CREATE    D:\test1\user32.dll    名称未找到    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a
189918    13:44:34.8303957    vfp9.exe    3080    FASTIO_NETWORK_QUERY_OPEN    C:\WINDOWS\system32\user32.dll    不允许快速IO    
189919    13:44:34.8338328    vfp9.exe    3080    IRP_MJ_CREATE    C:\WINDOWS\system32\user32.dll    成功    访问期望: 读取属性, 安排: 打开, 选项: 打开重解析点, 属性: n/a, 共享模式: 读取, 写入, 删除, 分配的大小: n/a, 打开结果: 已打开
189920    13:44:34.8341052    vfp9.exe    3080    FASTIO_QUERY_INFORMATION    C:\WINDOWS\system32\user32.dll    成功    Type: 查询基本信息-文件, 创建时间: 1980-1-1 0:00:00, 最后访问时间: 2012-3-9 0:00:00, 上次写入时间: 2008-4-14 5:00:00, 更改时间: 1601-1-1 8:00:00, 文件属性: A
189921    13:44:34.8362870    vfp9.exe    3080    IRP_MJ_CLEANUP    C:\WINDOWS\system32\user32.dll    成功    
189922    13:44:34.8363244    vfp9.exe    3080    IRP_MJ_CLOSE    C:\WINDOWS\system32\user32.dll    成功    
189923    13:44:34.8365236    vfp9.exe    3080    IRP_MJ_CLEANUP    D:\test1\pro1.FXP    成功    
    

并将上述过程重复 5000 次
看过了操作系统的动作,可以发现vfp 执行Declare long GetDesktopWindow In user32的时候会先在当前目录查找user32.dll,结果没有找到,然后vfp 的 home() 目录去查找,然后去系统的System32目录查找。

难道时间差距在这里么?

测试一下,把User32.dll 从System32目录拷贝到当前目录,然后测试1.中的代码,结果发现,虽然时间比当前目录中没有User32.dll的时候时间节省了近一半,但仍比使用WIN32API的时间长的多

为什么会这样

看看vfp的帮助文件的Declare命令帮助

IN LibraryName 
指定外部共享库名,其中包含用 FunctionName 指定的函数。如果为 LibraryName 指定 WIN32API,则 Visual FoxPro 在Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll, 和 Advapi32.dll 中搜索 32-位 Windows .dll 函数。 

这里WIN32API已经指定了这部分动态库
使用WIN32API的方式声明api函数的语句执行的时间比执行一条普通的vfp语句的时间要长,推测这部分时间的差异应该是在这些dll中搜索函数的时间,不肯定

首先肯定的是使用WIN32API的方式声明的api函数在调用该api函数的时候仍然是调用实际dll的函数(比如User.dll),这里可以使用下面代码

CLEAR
CLEAR DLLS
m.nStart = SECONDS()
FOR m.ii = 1 TO 5000
    Declare long GetDesktopWindow In WIN32API
    GetDesktopWindow()
ENDFOR
? 'win32api', SECONDS() - m.nStart

然后在 Procmon 中看到,确实调用了System32下的User32.dll


对比上述结果,仍然是使用WIN32API的方式声明api函数占绝对优势,该结果与 版主 的结果是相同的

欢迎拍砖,有补充的地方我也会继续跟帖

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
独狼VFP游戏开发工具 独狼VFP游戏开发工具包含三部分库函数构成,OpenGL库, DxInput库,DxAudio库等三部分,这三部分合并到DLGame.fll库文件中。 OpenGL(全写Open Graphics Library)是定义了一个跨编程语言、跨平台的编程接口,它用于三维图象(二维的亦可)。 OpenGL是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。 OpenGL不是语言,是专业的图形程序接口。现在Windows系统的主流编译环境有Visual C++/C#,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。今天我把他移植到了Visual Foxpro9中,为喜爱图形设计的狐友带来福音。 OpenGL原函数为C函数,我们通过FLL库,封装到了DLGame.fll库中,大多数函数的名称和定义都和原C函数相同,因此具有很强的移植性。 DxInput库是封装了微软DirectX的DirectInput开发工具库,使键盘,鼠标,游戏杆的控制编程更加高效和简单。这些函数也封装到了DLGame.fll库中 DxAudio库是封装了微软DirectX的DirectAudio开发工具库,DirectAudio包含两部分,DirectMusic和DirectSound。DirectMusic用于播放音效的mid格式文件,通常用于背景音乐。DirectSound用于播放wav格式的音乐文件,一般用于音效效果。通过我们的封装,对音乐编程更加高效和简单。这些函数也封装到了DLGame.fll库中 一般编程语言必须先编译再运行,调试麻烦。VFP有先天的优势,边解释边运行。可以说,程序编写完成就可以通过DO命令运行程序。 完整例子,可以在我们帮助中点红色感叹号运行。
vfp9.0调用API制作照相软件实例 PUBLIC WM_CAP_DRIVER_DISCONNECT PUBLIC hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP DECLARE INTEGER capCreateCaptureWindowA IN "AVICAP32.DLL" STRING lpszWindowName ,INTEGER dwStyle , INTEGER x, INTEGER Y, INTEGER nWidth ,INTEGER nHeight,INTEGER ParentWin,INTEGER nId DECLARE INTEGER SendMessage IN "user32" INTEGER HWND, INTEGER wmsg,INTEGER wpar1, INTEGER wpar2 DECLARE INTEGER SendMessage IN "user32" AS SendMessageA INTEGER HWND, INTEGER wmsg,INTEGER wpar1, STRING wpar2 *!* 显示: WM_USER = 1024 WM_CAP_START = WM_USER WM_CAP_STOP = WM_CAP_START + 68 WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10 WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11 WM_CAP_SAVEDIB = WM_CAP_START + 25 WM_CAP_GRAB_FRAME = WM_CAP_START + 60 WM_CAP_SEQUENCE = WM_CAP_START + 62 WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20 WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6 WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2 WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3 WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5 WM_CAP_SET_SCALE=WM_CAP_START+ 53 WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,200,150,THISFORM.HWND ,0) &&显示大小 IF hWndC 0 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0) SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0) SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) * THISFORM.ACTIVATE ENDIF

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值