我想重构 DelphiAST以使用接口来处理不同的类型,而不是它现在使用的笨重的 TDirectionary。
一些研究表明,70% 以上的运行时间都花在了字典上。
所以我将制作如下接口:
TSyntaxNode = class
...
end;
IIdentifier = interface
['{D72E945D-E397-4E02-B702-8AE6C235F9C6}']
function GetIdentifier: string;
property Identifier: string read GetIdentifier;
end;
IMethod = interface(Identifier)
['{8E6119DC-E0F3-42BD-A5BF-FB658E34499E}']
.....
end;
TMethodNode = class(TSyntaxNode, IMethod, IIdentifier,...)
...
end;
根据罗马的问题是:
引用计数可能会导致性能问题。DelphiAST 创建了数千个类来生成语法树(当输入文件足够大时,超过 100,000 个 TSyntaxNode 实例)。引用计数器会被调用多少次?
每次发生这种情况时try finally
都会调用 hidden ,这会减慢速度。
严格使用
const
in 方法参数可以防止引用计数代码调用该方法,但是每次您执行类似的操作时它仍然会发生MyRef = List[0]
- 它会增加分配给 的引用计数MyRef
,即使该项目仍然存在于列表中。
如何使用接口而不用担心 refcounting 和 try-finally 块?
我非常乐意手动管理类的破坏。
更多信息
我猜我需要TAggregatedObject
用作基础祖先。
而且我在某处读到不分配 GUID 会抑制引用计数,但必须提供资源来支持它。
但是,丢失 GUID 会导致获取子接口时出现问题,因此我必须为此设计一个解决方案....