Microsoft Teams Efficiency mode
Hi All,
The efficiency mode setting in Microsoft Teams is designed to improve performance and reduce resource usage, especially on devices that are under hardware stress or have limited capabilities.
Note: Turning this setting on may affect some functionality such as camera resolution.
- Use only when resources are low (Default): Reduce processor and memory usage when reduced resources are detected.
- Never use efficiency mode: Prioritize a richer experience, using more system resources.
- Always use efficiency mode: Reduce processor and memory use at all times.
When using “Always use effiency mode” is activated you see the leaf icon on the top left.
When using Sysinternals Process Explorer you see that Microsoft Teams using several msedgewebwiew2.exe subprocesses
I was curious and wrote a little PowerShell Script with Copilot that can get all the Teams Processes and summarize the Memory used.
- Github Get-MSTeamsMemory.ps1
###############################################################################
# Get ms-teams.exe Processes for current user and all its Sub-Processes
# Summarize all the Memory used
# 2026-09-06 - Initial Version - Andres Bohren
###############################################################################
# Get current user
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
# Get all processes
$allProcesses = Get-CimInstance Win32_Process
# Teams root processes
$teamsProcesses = $allProcesses | Where-Object {
$_.Name -match '^(ms-teams|teams)\.exe$'
}
if (-not $teamsProcesses) {
Write-Host "No Microsoft Teams process found." -ForegroundColor Yellow
return
}
# Function to get all child processes recursively
function Get-ChildProcesses {
param (
[int[]]$ParentProcessIds,
$AllProcesses
)
$children = $AllProcesses | Where-Object {
$_.ParentProcessId -in $ParentProcessIds
}
if ($children) {
$grandChildren = Get-ChildProcesses `
-ParentProcessIds $children.ProcessId `
-AllProcesses $AllProcesses
return $children + $grandChildren
}
return $children
}
# Collect Teams processes and descendants
$teamsTree = foreach ($teams in $teamsProcesses) {
$children = Get-ChildProcesses `
-ParentProcessIds $teams.ProcessId `
-AllProcesses $allProcesses
$teams
$children
}
# Remove duplicates
$teamsTree = $teamsTree | Sort-Object ProcessId -Unique
# Retrieve process owner and memory information
$result = foreach ($proc in $teamsTree) {
try {
$ownerInfo = Invoke-CimMethod -InputObject $proc -MethodName GetOwner -ErrorAction Stop
$owner = "$($ownerInfo.Domain)\$($ownerInfo.User)"
if ($owner -ieq $currentUser) {
$psProc = Get-Process -Id $proc.ProcessId -ErrorAction SilentlyContinue
if ($psProc) {
[PSCustomObject]@{
ProcessName = $proc.Name
PID = $proc.ProcessId
MemoryMB = [Math]::Round($psProc.WorkingSet64 / 1MB, 2)
}
}
}
}
catch {
# Ignore processes where owner cannot be determined
}
}
# Display details
$result | Sort-Object MemoryMB -Descending | Format-Table -AutoSize
# Summary
$totalMemoryMB = ($result | Measure-Object MemoryMB -Sum).Sum
Write-Host ""
Write-Host "Teams Total Memory Usage (Current User): $([Math]::Round($totalMemoryMB,2)) MB" -ForegroundColor Green
I’ve adapted the Script so it returns only the Value
###############################################################################
# Get ms-teams.exe Processes for current user and all its Sub-Processes
# Summarize all the Memory used
# 2026-09-06 - Initial Version - Andres Bohren
###############################################################################
# Get current user
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
# Get all processes
$allProcesses = Get-CimInstance Win32_Process
# Teams root processes
$teamsProcesses = $allProcesses | Where-Object {
$_.Name -match '^(ms-teams|teams)\.exe$'
}
if (-not $teamsProcesses) {
Write-Host "No Microsoft Teams process found." -ForegroundColor Yellow
return
}
# Function to get all child processes recursively
function Get-ChildProcesses {
param (
[int[]]$ParentProcessIds,
$AllProcesses
)
$children = $AllProcesses | Where-Object {
$_.ParentProcessId -in $ParentProcessIds
}
if ($children) {
$grandChildren = Get-ChildProcesses `
-ParentProcessIds $children.ProcessId `
-AllProcesses $AllProcesses
return $children + $grandChildren
}
return $children
}
# Collect Teams processes and descendants
$teamsTree = foreach ($teams in $teamsProcesses) {
$children = Get-ChildProcesses `
-ParentProcessIds $teams.ProcessId `
-AllProcesses $allProcesses
$teams
$children
}
# Remove duplicates
$teamsTree = $teamsTree | Sort-Object ProcessId -Unique
# Retrieve process owner and memory information
$result = foreach ($proc in $teamsTree) {
try {
$ownerInfo = Invoke-CimMethod -InputObject $proc -MethodName GetOwner -ErrorAction Stop
$owner = "$($ownerInfo.Domain)\$($ownerInfo.User)"
if ($owner -ieq $currentUser) {
$psProc = Get-Process -Id $proc.ProcessId -ErrorAction SilentlyContinue
if ($psProc) {
[PSCustomObject]@{
ProcessName = $proc.Name
PID = $proc.ProcessId
MemoryMB = [Math]::Round($psProc.WorkingSet64 / 1MB, 2)
}
}
}
}
catch {
# Ignore processes where owner cannot be determined
}
}
# Summary
$totalMemoryMB = ($result | Measure-Object MemoryMB -Sum).Sum
$totalMemoryMB2 = $([Math]::Round($totalMemoryMB,2))
return $totalMemoryMB2
Then wrote another Script that writes the Memory every Minute to a CSV File
$ScriptPath = "C:\Temp\Get-MSTeamsMemory.ps1"
do {
$TotalMemoryMB = & $ScriptPath
Write-Host "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Teams Memory: $TotalMemoryMB MB"
Add-Content -Path C:\Temp\TeamsMemoryDefault.csv -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'),$TotalMemoryMB"
Start-Sleep -Seconds 60
} while ($true)
Results
I’ve tracked two diffrent days where i had several Teams Meetings. As a User i could not distinguish between Teams efficiency Mode on or off. I never felt teams was slow or takes longer in eighter setting.
As you can see in the Graphics below, in efficiency Mode it uses a bit less Memory. Can’t tell if the same is true for CPU, because i didn’t measure that.
With the default setting
With Effiency Mode on
Regards
Andres Bohren







