VB非实用性使API函数变快的方法
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
本意只是做出对比VB调用API到底有多慢
2021年03月08日 16点03分 1
level 11
余思培 楼主
复制这段内容后打开百度网盘App,操作更方便哦。链接:网页链接提取码:wi22
2021年03月08日 16点03分 2
level 11
余思培 楼主
用于测试的DLL源码
2021年03月08日 16点03分 4
level 11
余思培 楼主
源码
2021年03月08日 16点03分 5
level 14
没有试试通过 tlb 声明调用API?VB6通过tlb调用API,在生成exe后的调用效率跟VC6很接近。
2021年03月09日 04点03分 6
tlb应该快一点,毕竟我这个与VB类成员函数类似,先指向一个跳转表,然后才跳转过去,所以我才说实用性不大[笑尿]
2021年03月09日 04点03分
不是没试tlb,而是不会[滑稽],因为自学,所以一直也不太为意,也就不太会,不过这么一对比之后......我觉得tlb我还是得学一下[笑尿]
2021年03月09日 04点03分
level 11
vb虽然也讲求效率
但是,vb的出身和背景,决定了他是以应用简便为第一选择
2021年03月09日 04点03分 8
我知道,我只是知道了VB6的调用API需要经过一个DLLFunctionCall,然后就测试了一下到底有多慢😂,而且我测试的函数也是极其极端的,测试的方法也很极端,实际上VB6慢不了多少,这个则属于一个实验性的方法,没什么实用性
2021年03月09日 05点03分
是的,一般还是Declare用的多,但是tlb调用速度快和生成的exe较小(尤其declare声明大量API函数时),可以先Declare做,然后慢慢替换成tlb的
2021年03月09日 05点03分
@余思培 tlb调用API就不走DllFunctionCall,包括VB6内置函数也是通过tlb声明来调用msvbvm60.dll的。
2021年03月09日 05点03分
[胜利]回复 ◎余思培 :
2021年03月09日 05点03分
level 10
下载楼主的代码看了一下。
首先说:象楼主这样爱折腾、爱研究技术的人,
  还是值得肯定、值得赞扬的。[滑稽]
不过呢,别怪我沷冷水,这一个所谓的“变快”的技术,
  我认为真正的没有什么价值。
首先:灵活度很差,不同的参数个数、不同的参数类型,
  可能都得“分别做一个接口”。(至少得每种弄1个吧)
其次:若是“同一个接口用于调用不同的函数”,
  则每次“调用切换”之前就得进行一次处理,
  这反而会浪费更多的时间在“处理跳转参数”上了。
(假设工程中有几个“相同参数类型和个数”的函数,可以“公用1个跳板”)
但最根本的是:每次调用,这个“能节省”的时间真的是可以忽略不计,
  却徒增了代码的复杂度,完全是得不偿失。
以在我的电脑上测试结果来评判(楼下回复贴截图):
2000万次调用:
在“Declare模式”下,大约270ms;
在“跳板模式”下,平均在70几ms。
2千万次调用,多消耗不到200ms,平均每次多消耗不到0.01微秒。
一般来说,一次“事件过程”完成下来,在你的VB6代码中调用API的次数能有几何?
要说API调用最频繁的,可能就是用VB6做游戏了。
简单点的,一次GameLoop下来,也没有多少次的调用;
要是“很复杂”的游戏,一次GameLoop下来,
 能有几千、上万的API调用次数,那FPS肯定也高不到哪去。
你要是一帧画面要绘它十几甚至几十ms,你去“节约”个几微秒、几十微秒,
 又能得到多少的“性能提升”呢![汗]
2021年03月10日 15点03分 9
所以我的标题也说了,非实用性,而且前面也说了本意只是测试vbAPI调用有多慢,使用极端多次小函数只是为了测算出相对调用耗时,实际运行中,这点耗时几乎可以省略不计
2021年03月10日 16点03分
至于折腾,这个纯属心血来潮,本来准备利用一个FuncCall简单测试一下就行了,但发现FuncCall用不了,才有的这个[滑稽]
2021年03月10日 16点03分
level 10
我测试时,没有使用楼主提供的DLL文件,
 自己按楼主的汇编代码,用VB6编译了一个“等同”的DLL来用。
因为我的系统是纯“衤果 奔”的[滑稽][滑稽][滑稽]
虽然用了楼主的dll,中招的可能性很小,但还是小心为上。
先贴张我的DLL的导出函数信息截图:
注意TestFunc的“函数入口”是: &H1560 。
然后就是我的DLL的VB6代码,和“反汇编”之后的代码截图。
下图中,反汇编代码的下面那个框中的那段,就是TestFunc 的代码了。
因为我编译DLL时,选用的代码基址是 &H12000000,
因此“叠加”之后,函数入口的虚拟地址就是&H12001560了。
而上面那个框中的部分(&H12001550开始),则就是DllMain的函数代码了。
可以看到,我编译好之后的DLL,代码跟楼主的“汇编代码”是完全一致的。
当然,楼主的“计算时间”的方法,精度太低了点,
我也就把楼主的代码适当修改了一下。
  江湖规矩,贴出代码截图,大家也可看看:
下面两张就是运行结果的截图了,勿需多言,大家看看就好。
(注意,这是编译后运行的,因为“测试2”在IDE中无效)
2021年03月10日 15点03分 10
说明一下:我的“改动”主要就是D1和D2这两个测试过程,其它的地方大家按“没有改动”看待就好了。[滑稽][滑稽][滑稽]。另外就是“没有Declare声明”的API,我是用的TLB,大家千万别感到奇怪,甚至觉得“代码好像不对”[滑稽]
2021年03月10日 15点03分
level 10
此类研究和之前一大波人折腾vb6多线程差不多,研究一下可以,不过没啥实用性,实用性好的还得用tlb调用
2021年03月14日 19点03分 11
折腾嘛,哪管实用性(标题也说了非实用性[滑稽]
2021年03月15日 01点03分
1