Delphi 创建快速事例语句(程序集)
我有一个项目,它大量使用案例陈述,并附带许多程序。我知道你可以将案例陈述分为两个部分,分为10个部分,第二个案例陈述用于单独的程序。但如果我能成功,我有个更好的主意。 我想称之为装配箱Delphi 创建快速事例语句(程序集),delphi,Delphi,我有一个项目,它大量使用案例陈述,并附带许多程序。我知道你可以将案例陈述分为两个部分,分为10个部分,第二个案例陈述用于单独的程序。但如果我能成功,我有个更好的主意。 我想称之为装配箱 Prolist: array [1..500] of Pointer = (@Procedure1, @Procedure2, @Procedure3, @Procedure4, @Procedure5); Procedure ASMCase(Prolist: array of Point
Prolist: array [1..500] of Pointer =
(@Procedure1, @Procedure2, @Procedure3, @Procedure4, @Procedure5);
Procedure ASMCase(Prolist: array of Pointer; No: Word; Var InRange: Boolean);
var Count : DWord;
PTR: Pointer;
Pro : Procedure;
begin
Count := No * 4;
InRange := boolean(Count <= SizeOf(Prolist));
If not InRange then Exit;
PTR := Pointer(DWord(@Prolist[1]) + Count);
If PTR <> nil then Pro := @PTR else Exit;
Pro; /run procedure
end;
Prolist:指针数组[1..500]=
(@Procedure1、@Procedure2、@Procedure3、@Procedure4、@Procedure5);
过程ASMCase(Prolist:指针数组;No:Word;Var-InRange:Boolean);
var计数:DWord;
PTR:指针;
赞成:程序;
开始
计数:=No*4;
InRange:=boolean(Count按值传递该数组的代价很高。按常量传递
我看不出InRange
标志和测试的意义。不要通过超出范围的索引。如果必须测试,请正确操作。不要使用测量字节大小的SizeOf
。如果必须,请使用high
或者Length
。我对此表示怀疑
指针分配测试(PTR nil
)是假的。该条件的计算结果总是为真。而且数组索引非常奇怪。[]
有什么问题
最重要的是,您的阵列是基于1的(通常是一个糟糕的选择),但开放阵列总是基于0。这可能会让您陷入困境
简而言之,我会扔掉所有的代码。这是错误的,也是不必要的。我会这样写:
ProList[No]();
为了实现这一目的,需要将数组定义为过程类型的数组,而不是指针类型的数组。添加一些类型安全性将是一个很好的举措
很难看出asm在这里有多大不同。编译器将发出最佳代码
如果您关心越界访问,请在调试模式下启用范围检查。如果性能至关重要,请在发布时禁用范围检查
请记住,随着复杂性的增加,全局数据结构往往无法很好地扩展。大多数有经验的程序员都会花一些时间来避免全局状态。您确定全局状态是您的正确选择吗
如果确实需要提高性能,请首先确定改进的机会。从数组读取和调用函数不太可能是候选项。请查看您调用的过程。瓶颈肯定存在
最后一点。试着忘记你曾经学习过将@
与函数指针一起使用。这样做会产生一个类型为指针
的非类型指针,可以分配给任何指针类型。因此,你完全放弃了类型检查。你的过程可能完全有错误的签名,编译器无法告诉你ou.使用类型安全的过程类型声明您的过程数组。这是我见过的最糟糕的过早优化情况之一。您的(执行不好的)错误概率为零case
的实现将比编译器生成的更快。您使用了什么基准测试来表明编译器生成的case
是您代码中的一个瓶颈?我有一个没有问题的项目,但我想我可以通过一些愚蠢的尝试来改进不是is的代码sue(在这个过程中,代码会变得非常复杂、复杂,并且更难维护)。总是一个坏主意。500 if..then语句占用太多的处理器时间。这在实践中很容易就快了50倍。我感兴趣的是如何使用Delphi代码让我能够灵活地访问过程或方法。你不需要500 if..then
语句。如果你认为你这样做了,你就犯了可怕的错误。Doing尝试修复某个同样错误的问题并不是一种改进。谷歌XY问题。你试图为问题添加一个可怕的修复,而不是解决实际问题。也许你不应该问如何编写汇编代码,而应该问如何解决导致你认为需要这样做的问题。而不是试图不这样做重新处理症状,治愈导致症状的疾病。您已经有了直接访问数组的代码。为什么您认为通过case语句间接访问数组会有所改进?为什么不先在Delphi中编写case语句,然后再将其转换为汇编程序。编译器实际上不会这样做他为您进行了转换,所以您不必从头开始。InRange是指一个错误,或与case语句中的else语句等效。这就是我的项目所需要的。SizeOf是一个很好的工具,它找到了一些人需要使用一段时间的Delphi低级代码,因为在处理时,它会删除您可以删除的错误在测试中被删除。这有助于如何使用方法指针我缺乏充分利用代码的经验。莱克斯,你自己承认,你缺乏经验。大卫没有。你不需要避免类型检查。你现在避免类型检查,因为你以前写过不好的代码,为了让它编译,你启动了aban进行安全保护。解决方法是返回并编写好代码。如果您需要避免使用此处显示的代码进行类型检查,那么您已经做了一些错误的事情,需要进一步回溯。解决方法是不要费力地添加更多您不懂的内容。@HeartWare for a procedure,尽管@
始终返回指针
。