0

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 を失うと、サブインターフェイスを取得する際に問題が発生するため、その解決策を考案する必要があります....

4

3 に答える 3

0

「何千ものオブジェクト」はいつも私を震えさせます。メモリ内のオブジェクトにはかなりのオーバーヘッドがあります。あなたはそれを忘れますが、数千を管理しようとしているとき、またはパフォーマンスが低下していることに気付いたとき、またはファイルから書き込みまたは読み取りを試み始めたときに再びポップアップします...

インターフェイスの使用は、私が知る限り、オブジェクト (クラス インスタンス) を引き続き使用するため、あまり変わりません。

この規模の取り組みには、古き良きストレート トゥ メモリ データ構造の特定の使用が必要です。たとえば、レコードの配列に格納された AST で遊んでいます: https://github.com/stijnsanders/strato

于 2015-04-27T05:50:48.900 に答える