Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 创建快速事例语句(程序集)_Delphi - Fatal编程技术网

Delphi 创建快速事例语句(程序集)

Delphi 创建快速事例语句(程序集),delphi,Delphi,我有一个项目,它大量使用案例陈述,并附带许多程序。我知道你可以将案例陈述分为两个部分,分为10个部分,第二个案例陈述用于单独的程序。但如果我能成功,我有个更好的主意。 我想称之为装配箱 Prolist: array [1..500] of Pointer = (@Procedure1, @Procedure2, @Procedure3, @Procedure4, @Procedure5); Procedure ASMCase(Prolist: array of Point

我有一个项目,它大量使用案例陈述,并附带许多程序。我知道你可以将案例陈述分为两个部分,分为10个部分,第二个案例陈述用于单独的程序。但如果我能成功,我有个更好的主意。 我想称之为装配箱

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,尽管
@
始终返回
指针