我有一个项目,它大量使用了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语句中有许多调用,时间对于快速处理器来说至关重要。
答案 0 :(得分:3)
按值传递该数组非常昂贵。通过const传递它。
我无法看到InRange
旗帜和测试点。不要超出范围指数。如果你必须测试,做对了。不要使用测量字节大小的SizeOf
。如果必须,请使用high
或Length
。我对此表示怀疑。
指针赋值测试(PTR <> nil
)是假的。这种情况总是评估为真。并且数组索引非常奇怪。 []
有什么问题?
最重要的是,你的数组是基于1的(通常是一个糟糕的选择),但是开放数组总是从0开始。可能会绊倒你。
简而言之,我扔掉了所有代码。这既错又不必要。我只是这样写:
ProList[No]();
为了编译这个数组,需要将数组定义为过程类型的数组,而不是Pointer
的数组。添加一些类型安全将是一个很好的举措。
很难看出这里有很多不同之处。编译器将发出最佳代码。
如果您担心超出访问范围,请在调试模式下启用范围检查。如果性能至关重要,请将其禁用以进行发布。
请记住,随着您增加复杂性,全球数据结构不会很好地扩展。大多数有经验的程序员都会花一些时间来避免全球状态。您确定全球州是您的正确选择吗?
如果您确实需要提高绩效,请首先确定改进的机会。从数组中读取并调用函数可能不是候选者。查看您调用的过程。肯定存在瓶颈。
最后一点。试着忘记你曾经学过如何使用函数指针@
。这样做会产生类型为Pointer
的无类型指针,可以将其指定给任何指针类型。因此你完全放弃了类型检查。您的过程可能完全有错误的签名,编译器无法告诉您。使用类型安全过程类型声明您的过程数组。