有无其他 Call Sub 的方法

时间:2022-06-22 14:37:19
' Class Test_AA

Public Sub  Test()
  
Call AA(1, 2, 3, 4, 5)   ' ---> 标准呼叫法
  
End Sub

Public Sub AA(a1, a2, a3, a4, a5 )


End  Sub



[请问]

除了 Call AA(1, 2, 3, 4, 5)   ' ---> 标准呼叫法

有没有其他呼叫法, 例如用 API 可以达成  Call AA(1, 2, 3, 4, 5)  一样的结果

要如何写呢  

[目的]  找出比 Call AA(1, 2, 3, 4, 5) 耗时更少 的另外一种呼叫法

thanks


[ps] 不要 CallByName() 因为效能太低 

7 个解决方案

#1


Call AA(1, 2, 3, 4, 5) 
已经是最高效的调用方式了,它就是原生的调用,如果你反汇编它的机器码,你会看到,它就是对应几个pop将参数放入堆栈和一个call跳转指令。不可能再高效了。

从写法上说,还可以简化一些,写成AA 1, 2, 3, 4, 5,两者等价。

#2


如果 就是对应几个pop将参数放入堆栈和一个call跳转指令

那为何他比较慢

是什么原因呢

测试过 delphi 


procedure  AA(a1: olevariant; a2: olevariant; .....)   ;
begin
end;    -->  VB 如果要 2秒, delphi 只要1秒


procedure  AA(a1: longint a2: longint; .....)   ;
begin
end;    -->  VB 如果要 2秒, delphi 只要 0.01秒


引用 1 楼 caozhy 的回复:
Call AA(1, 2, 3, 4, 5) 
已经是最高效的调用方式了,它就是原生的调用,如果你反汇编它的机器码,你会看到,它就是对应几个pop将参数放入堆栈和一个call跳转指令。不可能再高效了。

从写法上说,还可以简化一些,写成AA 1, 2, 3, 4, 5,两者等价。

#3


delphi支持fastcall
也就是不放入堆栈,直接靠寄存器传参数

VB不支持,除非你能改造linker、compiler和vbvm。VB使用stdcall。

#4


在delphi也可以指定stdcall强制delphi不使用fastcall,那么你可以观察到速度会慢很多,毕竟寄存器的速度和内存有一个数量级的差别。

甚至这样,vb还是会慢一些,如果你vb使用了variant类型,非本地类型,或者相同的函数实现,VB都会更慢。

#5


请问  ( 看到您也有回覆 C#, 猜测也会C#  ) 


(1) C# 可以用 FastCall 吗

(2) C# 的 基础运算 方面
(  四则运算+ - * / ^ , String处理, String內存配置 , Array 读写 , Call Sub,  Call Class ..这几个方面 ) 
 会比 VB 快吗 ( VB 编译优化已经全开了)

因为算根本不会 C#
之前只测试过 C# 的 GUI , 确定 .Net 的 GUI 特别慢, 慢上几倍以上  ( 这方面输 VB 的 OCX  ) 

之前都是google搜寻 C#, delphi, VB  效能比较文章, 也找不太到相关文章

#6


多线程方式调用,ADDRESSOF 

#7


引用 5 楼 Bobogg 的回复:
请问  ( 看到您也有回覆 C#, 猜测也会C#  ) 
  

(1) C# 可以用 FastCall 吗

(2) C# 的 基础运算 方面
(  四则运算+ - * / ^ , String处理, String內存配置 , Array 读写 , Call Sub,  Call Class ..这几个方面 ) 
 会比 VB 快吗 ( VB 编译优化已经全开了)

因为算根本不会 C#
之前只测试过 C# 的 GUI , 确定 .Net 的 GUI 特别慢, 慢上几倍以上  ( 这方面输 VB 的 OCX  ) 

之前都是google搜寻 C#, delphi, VB  效能比较文章, 也找不太到相关文章


C#和VB.NET的科学运算性能会比VB6强5~10倍。你试下就知道了。
但是.NET也不支持fastcall。

#1


Call AA(1, 2, 3, 4, 5) 
已经是最高效的调用方式了,它就是原生的调用,如果你反汇编它的机器码,你会看到,它就是对应几个pop将参数放入堆栈和一个call跳转指令。不可能再高效了。

从写法上说,还可以简化一些,写成AA 1, 2, 3, 4, 5,两者等价。

#2


如果 就是对应几个pop将参数放入堆栈和一个call跳转指令

那为何他比较慢

是什么原因呢

测试过 delphi 


procedure  AA(a1: olevariant; a2: olevariant; .....)   ;
begin
end;    -->  VB 如果要 2秒, delphi 只要1秒


procedure  AA(a1: longint a2: longint; .....)   ;
begin
end;    -->  VB 如果要 2秒, delphi 只要 0.01秒


引用 1 楼 caozhy 的回复:
Call AA(1, 2, 3, 4, 5) 
已经是最高效的调用方式了,它就是原生的调用,如果你反汇编它的机器码,你会看到,它就是对应几个pop将参数放入堆栈和一个call跳转指令。不可能再高效了。

从写法上说,还可以简化一些,写成AA 1, 2, 3, 4, 5,两者等价。

#3


delphi支持fastcall
也就是不放入堆栈,直接靠寄存器传参数

VB不支持,除非你能改造linker、compiler和vbvm。VB使用stdcall。

#4


在delphi也可以指定stdcall强制delphi不使用fastcall,那么你可以观察到速度会慢很多,毕竟寄存器的速度和内存有一个数量级的差别。

甚至这样,vb还是会慢一些,如果你vb使用了variant类型,非本地类型,或者相同的函数实现,VB都会更慢。

#5


请问  ( 看到您也有回覆 C#, 猜测也会C#  ) 


(1) C# 可以用 FastCall 吗

(2) C# 的 基础运算 方面
(  四则运算+ - * / ^ , String处理, String內存配置 , Array 读写 , Call Sub,  Call Class ..这几个方面 ) 
 会比 VB 快吗 ( VB 编译优化已经全开了)

因为算根本不会 C#
之前只测试过 C# 的 GUI , 确定 .Net 的 GUI 特别慢, 慢上几倍以上  ( 这方面输 VB 的 OCX  ) 

之前都是google搜寻 C#, delphi, VB  效能比较文章, 也找不太到相关文章

#6


多线程方式调用,ADDRESSOF 

#7


引用 5 楼 Bobogg 的回复:
请问  ( 看到您也有回覆 C#, 猜测也会C#  ) 
  

(1) C# 可以用 FastCall 吗

(2) C# 的 基础运算 方面
(  四则运算+ - * / ^ , String处理, String內存配置 , Array 读写 , Call Sub,  Call Class ..这几个方面 ) 
 会比 VB 快吗 ( VB 编译优化已经全开了)

因为算根本不会 C#
之前只测试过 C# 的 GUI , 确定 .Net 的 GUI 特别慢, 慢上几倍以上  ( 这方面输 VB 的 OCX  ) 

之前都是google搜寻 C#, delphi, VB  效能比较文章, 也找不太到相关文章


C#和VB.NET的科学运算性能会比VB6强5~10倍。你试下就知道了。
但是.NET也不支持fastcall。