【发布时间】:2011-05-23 22:28:16
【问题描述】:
在 Delphi 理智中,人们使用 class 来定义对象。
在 Windows 的 Turbo Pascal 中,我们使用了 object,而今天您仍然可以使用 object 创建对象。
区别在于object 位于堆栈上,而class 位于堆上。
当然,object 已贬值。
抛开所有这些:
使用object 代替class 是否有利于提高速度?
我知道 object 在 Delphi 2009 中已损坏,但我有一个特殊用例1),其中速度很重要,我正在尝试查找是否使用 @987654333 @ 会让我的东西更快而不会出错
此代码库在 Delphi 7 中,但我可能会将其移植到 Delphi 2007,尚未决定。
1)康威的人生游戏
长评论
感谢大家为我指明正确的方向。
让我再解释一下。我正在尝试更快地实现 hashlife、see also here 或 here for simple sourcecode
目前的记录保持者是golly,但 golly 使用了 Bill Gospher 原始 lisp 代码的直接翻译(作为一种算法非常出色,但在微观层面根本没有优化)。 Hashlife 使您能够在 O(log(n)) 时间内计算出一代。
它通过使用空间/时间权衡来做到这一点。出于这个原因,hashlife 需要大量内存,千兆字节并非闻所未闻。作为回报,您可以在 o(1) 时间内使用第 2^127 代 (170141183460469231731687303715880000000) 计算第 2^128 代 (340282366920938463463374607431770000000)。
因为 hashlife 需要为更大模式中出现的所有子模式计算哈希,所以对象的分配需要快速。
这是我确定的解决方案:
分配优化
我分配了一大块物理内存(用户可设置),比如说 512MB。在这个 blob 中,我分配了我称之为 cheese stacks 的东西。这是一个普通的堆栈,我在其中推送和弹出,但弹出也可以来自堆栈的中间。如果发生这种情况,我会将其标记在free 列表中(这是一个普通堆栈)。推送时,我首先检查free 列表,如果没有可用的内容,我会正常推送。我将按照建议使用记录,它看起来是开销最少的解决方案。
由于 hashlife 的工作方式,popping 很少发生,pushes 发生很多。我为不同大小的结构保留单独的堆栈,确保在 4/8/16 字节边界上保持内存访问对齐。
其他优化
- 递归删除
- 缓存优化
- 使用
inline - 哈希预计算(类似于彩虹表)
- 病理病例检测及回退算法的使用
- GPU 的使用
【问题讨论】:
-
我会考虑记录而不是旧式对象类型。
-
我相信问题有答案。使用基于堆栈的对象,您可以节省堆分配、取消分配,您的对象只需更改堆栈指针。
-
如果你不能用基于类的对象足够快地运行康威的生活游戏,那么你做错了很多事情。我敢打赌,您甚至可以在堆上分配一个对象而不是在开始时生成的原始对象集之外编写整个内容。例如,在棋盘上的每个方格分配一个对象是错误的。板应该由一个二维数组表示,如果你愿意,你可以将它包装在一个类中。一个实例是整个“游戏板”。您需要花时间进行这些优化(决策)。忘记对象。它已经死了。
-
@Warren,我已经有了一个最优算法(hashlife)。所以我已经完成了那个阶段,请不要假设任何东西。
-
不假设的东西。我要明确说明:TObjects 的堆分配在您的性能中将是可以忽略不计的因素,否则,您做错了。
标签: delphi class object delphi-7 delphi-2007