MX4*_*399 8 delphi design-patterns delphi-xe
我需要在我的控制下为有限数量的类提供undo + redo堆栈,这些类必须非常非常快并且使用RTTI和XML或流是不可行的,因为嵌套对象中的实例数可以高达2000+名单.需要通过memento模式复制和移出对象并立即重新加载.
有没有办法通过复制内存并从该内存重新实例化对象来克隆对象?
Gol*_*rol 15
几乎不.您可以轻松复制对象的内存,但该内存的一部分将是指针,在这种情况下,您只复制引用.这些指针也可以包括字符串和其他对象.
我认为最好的方法是从TPersistent(或任何后代)继承这些类,为每个类实现Assign方法.这样,您可以创建第二个实例并将对象分配给该新实例.在Assign实现中,您可以自己决定应该复制哪些数据以及不应该复制哪些数据.
Arn*_*hez 11
2000+嵌套对象不是那么庞大,并且即使使用RTTI也不会那么慢(磁盘访问或压缩会慢很多).使用直接的SaveToStream手动序列化,如果你使用FastMM4(自Delphi 2006以来的默认内存管理器),它会非常快.
也许你可能会改变你的算法,并使用动态数组来代替(有一个开源的串行这里).但是您的数据可能不适合这种记录.
或者从不/很少释放内存,只使用对象或记录引用.您可以拥有内存中的对象池,使用某种手动垃圾收集器,并且只处理对象(或记录)的引用.
如果您有string对象内部,则可能无法重新分配它们并维护已使用字符串的全局列表:引用计数和写入时复制将使其比标准序列化和分配(甚至使用FastMM4)快得多.
在所有情况下,值得对您的应用程序进行真正的分析.一般人类对性能瓶颈的猜测大多数时候都是错误的.只相信一个分析器和一个挂钟.也许你当前的实现并不是那么慢,真正的瓶颈不是对象进程,而是其他地方.
不要太早优化."在你加速之前做好准备.在你加快速度之前先说清楚.当你加快速度时保持正确." - Kernighan和Plauger,编程风格的元素.
| 归档时间: |
|
| 查看次数: |
3423 次 |
| 最近记录: |