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 インスタンス)。参照カウンターは何回呼び出されますか?
これが発生するたびに、hiddentry finally
が呼び出され、処理が遅くなります。
in method params を厳密に使用すると
const
、refcount コードがメソッドを呼び出すのを防ぐことができますが、たとえば、次のようなことを行うたびに発生することがわかっています。項目がまだリストに存在していても、 にMyRef = List[0]
割り当てられている refcount が増加します。MyRef
refcounting と try-finally ブロックを気にせずにインターフェイスを操作するにはどうすればよいですか?
クラスの破棄を手動で管理できることを非常にうれしく思います。
詳細情報
私はTAggregatedObject
、基本の祖先として使用する必要があると推測しています。
そして、GUIDを割り当てないと参照カウントが阻害されることをどこかで読みましたが、それを裏付けるためにソースを作成する必要があります。
ただし、GUID を失うと、サブインターフェイスを取得する際に問題が発生するため、その解決策を考案する必要があります....