Skip to content

Commit e50c079

Browse files
committed
perf: ChatSegment IDisposable 패턴 최적화로 GC 성능 개선
파이널라이저 제거로 종단 큐 압박 및 Gen2 승격 방지 _disposed 플래그 추가로 중복 Dispose 호출 시 멱등성 보장 Dispose 패턴 간소화로 불필요한 virtual 메서드 제거 관리형 리소스(IMemoryOwner)만 해제하는 경량 구현
1 parent d4f8631 commit e50c079

File tree

1 file changed

+9
-20
lines changed

1 file changed

+9
-20
lines changed

ProjectVG.Application/Models/Chat/ChatSegment.cs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ public sealed class ChatSegment : IDisposable
2222
internal IMemoryOwner<byte>? AudioMemoryOwner { get; private set; }
2323
internal int AudioDataSize { get; private set; }
2424

25+
// Dispose 멱등성 보장을 위한 플래그
26+
private bool _disposed;
27+
2528

2629

2730
public bool HasContent => !string.IsNullOrEmpty(Content);
@@ -149,31 +152,17 @@ public ChatSegment WithAudioMemory(IMemoryOwner<byte> audioMemoryOwner, int audi
149152

150153
/// <summary>
151154
/// 리소스 해제 (IMemoryOwner 해제)
155+
/// 멱등성을 보장하여 여러 번 호출해도 안전합니다.
152156
/// </summary>
153157
public void Dispose()
154158
{
155-
Dispose(true);
156-
GC.SuppressFinalize(this);
157-
}
159+
if (_disposed) return;
158160

159-
/// <summary>
160-
/// 보호된 Dispose 패턴 구현
161-
/// </summary>
162-
/// <param name="disposing">관리되는 리소스를 해제할지 여부</param>
163-
private void Dispose(bool disposing)
164-
{
165-
if (disposing && AudioMemoryOwner != null)
166-
{
167-
AudioMemoryOwner.Dispose();
168-
}
169-
}
161+
// 관리형 리소스만 해제 (IMemoryOwner)
162+
AudioMemoryOwner?.Dispose();
170163

171-
/// <summary>
172-
/// Finalizer - 관리되지 않는 리소스 정리 (최후 안전장치)
173-
/// </summary>
174-
~ChatSegment()
175-
{
176-
Dispose(false);
164+
_disposed = true;
165+
// 파이널라이저가 없으므로 GC.SuppressFinalize 불필요
177166
}
178167
}
179168
}

0 commit comments

Comments
 (0)