创建快速案例陈述(汇编)

时间:2015-02-21 22:29:54

标签: delphi

我有一个项目,它大量使用了case语句,并且有许多程序。我知道您可以将案例陈述放在两个撕裂排列中,分为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;​

关键是我正在创建一个直接跳转到该过程。 在我的情况下,程序可以具有相同的标题,并且可以访问任何奇数信息的全局数据。我认为在汇编中编写它会更快,但我不确定的是运行程序。请不要问为什么我这样做,因为我有500个程序,在case语句中有许多调用,时间对于快速处理器来说至关重要。

1 个答案:

答案 0 :(得分:3)

按值传递该数组非常昂贵。通过const传递它。

我无法看到InRange旗帜和测试点。不要超出范围指数。如果你必须测试,做对了。不要使用测量字节大小的SizeOf。如果必须,请使用highLength。我对此表示怀疑。

指针赋值测试(PTR <> nil)是假的。这种情况总是评估为真。并且数组索引非常奇怪。 []有什么问题?

最重要的是,你的数组是基于1的(通常是一个糟糕的选择),但是开放数组总是从0开始。可能会绊倒你。

简而言之,我扔掉了所有代码。这既错又不必要。我只是这样写:

ProList[No]();

为了编译这个数组,需要将数组定义为过程类型的数组,而不是Pointer的数组。添加一些类型安全将是一个很好的举措。

很难看出这里有很多不同之处。编译器将发出最佳代码。

如果您担心超出访问范围,请在调试模式下启用范围检查。如果性能至关重要,请将其禁用以进行发布。

请记住,随着您增加复杂性,全球数据结构不会很好地扩展。大多数有经验的程序员都会花一些时间来避免全球状态。您确定全球州是您的正确选择吗?

如果您确实需要提高绩效,请首先确定改进的机会。从数组中读取并调用函数可能不是候选者。查看您调用的过程。肯定存在瓶颈。

最后一点。试着忘记你曾经学过如何使用函数指针@。这样做会产生类型为Pointer的无类型指针,可以将其指定给任何指针类型。因此你完全放弃了类型检查。您的过程可能完全有错误的签名,编译器无法告诉您。使用类型安全过程类型声明您的过程数组。