Skip to content

Commit

Permalink
Cache current process object to avoid performance hit (#5597)
Browse files Browse the repository at this point in the history
* Read working set from Environment in ProcessInfo since it has better performance.

* Add unit test for ProcessInfo.

* Remove OSSkipCondition tag from process info unit test since it's cross-platform.

* Use Environment.WorkingSet in GetMemoryUsageInBytes.
  • Loading branch information
haipz authored Nov 12, 2024
1 parent 95a80cc commit 4b8dad5
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;

Expand Down Expand Up @@ -41,7 +42,6 @@ public ulong GetMemoryUsage()

public ulong GetCurrentProcessMemoryUsage()
{
using Process process = Process.GetCurrentProcess();
return (ulong)process.WorkingSet64;
return (ulong)Environment.WorkingSet;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,7 @@ internal static long GetCpuTicks()

internal static long GetMemoryUsageInBytes()
{
using var process = Process.GetCurrentProcess();
return process.WorkingSet64;
return Environment.WorkingSet;
}

internal static ulong GetTotalMemoryInBytes()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.Extensions.Diagnostics.ResourceMonitoring.Windows.Interop;
using Microsoft.TestUtilities;
using Xunit;

namespace Microsoft.Extensions.Diagnostics.ResourceMonitoring.Windows.Test;

/// <summary>
/// Process Info Interop Tests.
/// </summary>
/// <remarks>These tests are added for coverage reasons, but the code doesn't have
/// the necessary environment predictability to really test it.</remarks>
public sealed class ProcessInfoTests
{
[ConditionalFact]
public void GetCurrentProcessMemoryUsage()
{
var workingSet64 = new ProcessInfo().GetCurrentProcessMemoryUsage();
Assert.True(workingSet64 > 0);
}
}

0 comments on commit 4b8dad5

Please sign in to comment.