前不久偶然看到了 dkfdtf 版主N久前发的一个贴子,这里做了在没有动摇根本的情况下做了少许修改并加以说明
测试环境 Win xp sp3 + vfp 9.0 sp2 7423 + 1G内存 + 闪龙 3000+ CPU
1.先看测试代码
测试环境 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函数占绝对优势,该结果与 版主 的结果是相同的
欢迎拍砖,有补充的地方我也会继续跟帖