← All posts English version →

CPU 一忙就自動切到高效能,Windows 做得到嗎?

Windows 的設定裡沒有這個選項。電源計畫和電源模式都沒有「看 CPU 忙不忙再切換」的選項,工作排程器也沒有「CPU 使用率超過多少」這種觸發條件。你想在轉檔、輸出影片、跑大型運算時讓電腦自動換成高效能,做完再換回來,有兩個做法:自己寫一段一直執行的 PowerShell 腳本,或用 PowerDoze 的「CPU 忙碌時自動切換」。這篇附上可以直接貼上的腳本,也說明兩種做法各自做不到什麼。

Windows 的設定裡,真的沒有這個選項嗎?

沒有。電源計畫在「控制台 → 電源選項」裡選,Windows 的電源模式在「設定 → 系統 → 電源和電池」裡選(沒有電池的桌機,這一頁叫「電源」)。這兩個設定裡,都沒有「CPU 忙的時候換成別的」這種選項。

工作排程器可以在固定時間、開機、登入等時機執行切換電源計畫的指令,但它的觸發條件裡沒有「CPU 使用率超過多少」這一種。用指令建立排程時(schtasks /create),你能選的時機是:每隔幾分鐘、每小時、每天、每週、每月、只執行一次、開機時、登入時、閒置時、發生特定事件時。有「閒置時」,但沒有反過來的「很忙時」。

Windows 內建的效能監視器另外可以設定警示:CPU 使用率超過你設的門檻時,執行一個工作排程器的工作。不過忙起來和閒下來要各設一組,我們也沒有實際用它切換過電源計畫,所以這篇不教這個做法。

這篇用的做法,是讓一個程式一直開著,自己去看 CPU 使用率。你可以自己寫一個,也可以交給軟體。

CPU 使用率,一行 PowerShell 就讀得到

在工作列的搜尋框輸入 powershell,打開 Windows PowerShell,輸入下面這一行,按 Enter:

(Get-CimInstance Win32_Processor).LoadPercentage

它會回傳一個 0 到 100 的整數,就是你的 CPU 目前的使用率(百分比)。我們在測試電腦上執行過這一行。

一段 12 行的腳本:忙起來切高效能,閒下來切回平衡

把下面整段貼進 Windows PowerShell 視窗,按 Enter,它就開始執行。開頭三行是你可以改的數字:兩個門檻(百分比)、各要持續幾秒,還有多久讀一次。

$busyAt = 80; $busySec = 30   # CPU 使用率達 80% 以上、連續 30 秒,就切到高效能
$calmAt = 30; $calmSec = 60   # CPU 使用率降到 30% 以下、連續 60 秒,就切回平衡
$every = 5                    # 每 5 秒讀一次
$busySince = $null; $calmSince = $null; $boosted = $false
while ($true) {
  $cpu = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average; $now = Get-Date
  if ($null -ne $cpu -and $cpu -ge $busyAt) { if (-not $busySince) { $busySince = $now } } else { $busySince = $null }
  if ($null -ne $cpu -and $cpu -le $calmAt) { if (-not $calmSince) { $calmSince = $now } } else { $calmSince = $null }
  if (-not $boosted -and $busySince -and ($now - $busySince).TotalSeconds -ge $busySec) { powercfg /setactive SCHEME_MIN; $boosted = $true }
  if ($boosted -and $calmSince -and ($now - $calmSince).TotalSeconds -ge $calmSec) { powercfg /setactive SCHEME_BALANCED; $boosted = $false }
  Start-Sleep -Seconds $every
}

這段腳本做的事:

  1. 大約每 5 秒讀一次 CPU 使用率。讀法跟「CPU 使用率,一行 PowerShell 就讀得到」那一行一樣,只是多了一步取平均。
  2. 第一次讀到 80% 以上時,記下當時的時間;之後只要有一次低於 80%,就重新計時。從記下的時間算起滿 30 秒,就切到「高效能」計畫。
  3. 切過去之後,用同樣的方式看 30% 以下:連續滿 60 秒,就切回「平衡」計畫。
  4. CPU 使用率介於 30% 和 80% 之間,或這一次讀取失敗時,兩邊都重新計時,電源計畫維持不變。

門檻分成兩個數字,是為了避免來回切換。只用一個門檻(例如 60%)的話,轉檔時 CPU 使用率在 55% 到 65% 之間上下跳,你的電源計畫就會一下切過去、一下切回來。兩個門檻中間留一段空檔,就不會這樣。

這就像超市店長加開收銀台:排隊超過 8 個人、而且排了好一陣子,才多開一台;要等隊伍縮到 3 個人以下一段時間,才把那台關掉。如果只看「5 個人」一個數字,隊伍在 4、5、6 個人之間晃來晃去,收銀員就得一下坐下、一下起身,什麼事都做不好。

腳本裡的 SCHEME_MIN 和 SCHEME_BALANCED,是 Windows 內建電源計畫的別名,可以代替那串很長的計畫編號。SCHEME_MIN 是「高效能」,SCHEME_BALANCED 是「平衡」,還有一個 SCHEME_MAX 是「省電」。名字有點反直覺:MIN 和 MAX 指的是「省電的程度」,省電最少的就是高效能。你可以執行 powercfg /aliases 自己確認,我們在測試電腦上執行過。

用這段腳本之前,你要先知道的六件事

  • 視窗要一直開著。關掉 Windows PowerShell 視窗,腳本就停止。關掉的時候如果正在用高效能,它不會幫你切回來。重新開機之後,也要再貼一次。
  • 它切回的是「平衡」,不是你原本用的計畫。你平常用自己建立的計畫的話,先執行 powercfg /list,從清單裡複製那個計畫的編號(GUID,一串英文字母和數字),換掉腳本裡的 SCHEME_BALANCED。
  • 它只看 CPU。顯示卡很忙、CPU 使用率卻不高的時候,它不會切換。
  • 它一開始假設你正在用平衡。要先忙過一次、切到高效能之後,它才會切回平衡。
  • 有些電腦沒有「高效能」計畫。Modern Standby 是近幾年很多新筆電使用的一種睡眠方式。微軟的文件說,支援 Modern Standby 的電腦只能使用「平衡」或從平衡複製出來的計畫。這種電腦執行 powercfg /list,清單裡可能看不到高效能,這段腳本也就切不過去。
  • 公司或學校的電腦可能切不了。Windows 預設允許一般使用者切換電源計畫,但管理員可以用群組原則把它鎖住。

PowerDoze 的「CPU 忙碌時自動切換」怎麼運作?

這是 Pro 功能,在 Microsoft Store 版 PowerDoze(2.4.0 起)。打開 PowerDoze 的「智能偵測」頁,找到「CPU 忙碌時自動切換」的開關。出廠時這個開關是關的,你要自己打開。免費版會看到一張鎖定的卡片,寫著「升級 Pro 即可使用」。

打開之後,PowerDoze 在背景執行的程式大約每 3 秒讀一次整台電腦的 CPU 使用率。它讀的是上一次讀取到這一次之間的平均值,不是單一核心,也不包含顯示卡。判斷方式跟那段 12 行的腳本一樣用兩個門檻:要連續忙滿你設的時間才切換,中間有一次低於門檻就重新計時;CPU 使用率介於兩個門檻之間時,維持目前的狀態。

卡片上可以調的設定和預設值:

畫面上的設定預設值與可以調的範圍
「CPU 使用率達 80% 以上算忙碌」預設 80%,可以調 10%~100%
「要忙多久才切換」預設 30 秒
「忙碌時切換到」預設是內建的「高效能」模式,也可以選你其他的 PowerDoze 電源模式
「CPU 使用率降到 30% 以下算閒下來」預設 30%,可以調 5%~95%,而且要比忙碌的門檻低
「要閒多久才換回來」預設 60 秒

兩個「要多久」都從下拉選單選:5、10、15、30 秒,或 1、2、5、10、30、60 分鐘。

切換成功時,會跳出標題「CPU 忙碌」的通知;用預設設定的話,內容是「電腦正在忙,已切換到「高效能」」。卡片上也會顯示「電腦正在忙」或「目前不算忙」,以及「目前 CPU 使用率」是多少。

PowerDoze 切換它自己的電源模式時,改的是 Windows 的電源計畫,不會修改 Windows 的電源模式。內建的「高效能」模式,用的就是 Windows 的高效能計畫。

閒下來之後,由排程決定用哪個模式,不是還原成切換前那個

卡片的說明寫「閒下來後,就回到原本的模式」。實際的做法是:電腦閒下來之後,PowerDoze 會取消 CPU 規則的切換要求,改由你設定的依時間排程或其他規則,決定現在該用哪個模式。它不會記住切換前是哪個模式,再原樣還原。

所以如果你忙碌的這段時間剛好跨過排程換時段的時間,閒下來後用的是新時段的模式。切回來的時候,不會跳出「CPU 忙碌」的通知。

跟手動切換、其他規則撞在一起時,誰說了算?

由高到低:

  1. 電量過低時的規則最優先。
  2. 再來是你手動選的模式,或用「暫時套用」選的模式。這段時間 CPU 再忙,也不會蓋過你的選擇。暫時套用結束後,如果電腦還在忙,CPU 規則會自己重新生效。
  3. 接著是 CPU 忙碌、前景程式、Wi-Fi、離開模式這幾種規則。它們在同一層,以最近提出要求的那一條規則為準。CPU 規則每一段忙碌只提出一次要求;之後別的同層規則提出要求,它就讓位。
  4. 最後才是依時間排程。

依程式自動切換是另一種思路:你指定的程式(例如剪片軟體)在前景時就切換,切到沒有規則的程式,就回到排程該套用的模式。兩者的差別在這裡:輸出影片時你切去看網頁,剪片軟體不在前景,依程式的規則就不再套用;CPU 規則看的是電腦忙不忙,跟前景是哪個程式無關。

常見問題

電腦睡眠醒來後,PowerDoze 的忙碌計時會接著算嗎?

不會。兩次讀取 CPU 使用率之間隔了超過 15 秒(例如睡眠醒來),或讀取失敗,計時都會從頭開始。

電腦正在忙的時候,按了首頁的「恢復排程」,會怎樣?

PowerDoze 會改回排程這個時段的模式,這一段忙碌也不會再切換;要等電腦閒下來、下一次再忙起來時,才會再切過去。這個按鈕在首頁寫著「排程規則……現在應套用……」的提示旁邊,沒有設排程就不會出現。

用電池的時候,PowerDoze 也會切到高效能嗎?

會。這個功能不分插電或用電池,也沒有分開設定的地方。筆電用電池時不想被切到高效能,就先把開關關掉。

Pro 到期後,這些設定會不見嗎?

不會。這個功能會暫停,但你的設定都保留著,有 Pro 之後會自動恢復。

我們還不能確定的地方

  • 腳本裡切換電源計畫的那兩行(powercfg /setactive),我們沒有在測試電腦上實際執行,因為那台電腦的電源設定不能被更改。你自己執行時,這兩行會真的切換你的電源計畫。讀 CPU 使用率的那一行和整段迴圈的判斷,我們都實際執行過;執行時,把負責切換的兩行換成印出文字。
  • 「顯示卡很忙、CPU 使用率不高時不會切換」,是我們從 PowerDoze 只讀 CPU 使用率推論出來的。部分遊戲、用顯示卡算圖時可能會遇到,但我們沒有拿遊戲或算圖軟體實際測過。
  • 這篇寫的 PowerDoze 行為,是我們照程式碼整理的,還沒有逐項實際操作驗證。

這篇的限制

你只是偶爾輸出一次影片的話,不需要任何自動切換。輸出前到「控制台 → 電源選項」選「高效能」,做完再選回「平衡」就好;或者在「設定 → 系統 → 電源和電池」把 Windows 的電源模式改成「最佳效能」(電源計畫是「平衡」或從平衡複製出來的計畫時,才能調整)。這兩個設定差在哪,這篇有說明。你不需要我們,也不需要多開一個腳本視窗。

想按一組鍵就切換,可以看用快速鍵切換電源計畫;想切過去、時間到自動換回來,可以看暫時切換電源計畫。

不管是腳本還是 PowerDoze,都只看 CPU 使用率。如果你的工作主要是顯示卡在忙,腳本和 PowerDoze 可能都不會切換。

不想每次轉檔前都記得切換,也不想一直開著一個 PowerShell 視窗?打開 PowerDoze 的「CPU 忙碌時自動切換」,電腦忙起來它就切過去,閒下來再交回給你的排程。

從 Microsoft Store 取得 PowerDoze從 Microsoft Store 取得 PowerDoze

Nisonxi

我是 Nisonxi,PowerDoze 的開發者。我會做這個工具,是因為自己的 Windows 桌機整天閒置卻幾乎滿功率運轉,市面上找不到能自動判斷情況並切換的工具。這個部落格是這段過程的筆記。

關於作者與 PowerDoze →