Windows10のショートカットキーが重い件(Superfetch)

最近,Windowsに備わってるショートカットキー登録機能を多用するようにしました.

f:id:wgg00sh:20170130174547p:plain

ショートカットキー登録

【Windows10】 自分でショートカットを設定。効率化で差をつけよう。
interprism.hatenablog.com


よく使うファイル(ブラウザの.lnkなど)に対して,即時に起動するショートカットキーを設定することができます.
Ctrl,Shift,Altと,アルファベットなどの組み合わせで設定できます.
(実行中のアプリケーションと干渉する場合もあるので注意:Ctrl+Shift+Sなんかは名前を付けて保存と被ったり)

で,このショートカットキーを登録したファイルを,デスクトップかスタートメニューの中に入れておくと,そのキーを押した瞬間に実行されます.
僕はデスクトップに物は置かないのでスタートメニュー安定ですね.

ここに置くとショートカットキーが使用できるようになります
C:\ProgramData\Microsoft\Windows\Start Menu


と,ここまで聞けば中々に便利な機能だったのですが...

めっちゃ反応が遅い

はい,大きな問題が見つかりました.
何故かキーを押しても実行されるまでにタイムラグが存在するのです.
僕の場合は約1.5秒~2秒ほどの遅延が起こりました.
すぐに起動するために使う機能なのに,このような遅延は認めません

原因を探す

とりあえず,いつものMicrosoftのコミュニティを見に行ってみると,同じ現象が起こっている人がいました.
answers.microsoft.com

この中を覗いていると,こんな書き込みが

Windows7Windows8.xの時にもショートカットキーが反応しなくなる事がよくありましたが、これらはタスクバー通知領域のアイコンがアニメーションを行っている間に起きる事が大半でした。
常駐ものが通知領域アイコンを書き換えるとしばらくの間シェルが反応がしなくなるんですね。
通知領域アイコンを書き換えるアプリなるべく隠すようにして、なだめなだめ、何年も使ってきましたw

ずっと放置されてきた上記のバグがWindows10で治っているとはとても思えませんが、
Windows10ではこれに加えて更に
  「ストアアプリなどが中断状態になっているとショートカットキーの反応が鈍くなる」
という病気が追加されてしまったようです。

なんか,意味わからないですね...
更に続きに,

恐らく
SearchUI.exe / ShellExperienceHost.exe / Microsoft.Photos.exe / WinStore.Mobile.exe / Video.UI.exe
あたりが「中断」状態で見つかると思います。

f:id:wgg00sh:20170130180415p:plain
ありました.
調べたところ,SearchUIはWin+Qで出てくる検索機能を制御してるらしく,消すべきではないようでした.(Cortanaとは別).
ShellExperienceHostも,シェルまわりの制御にかかわっているようで,そこそこの頻度で端末を開く自分にとっては消すべきではなさそうでした.
さっきのSSには映っていませんでしたが,時々「Calclator」や「SystemSettings」といったプログラムも中断状態で見つかることがありました.

解決案1:強引に消す

ってことでここまで得られた情報から,「中断状態のアプリを完全に消すと,ショートカットキーの遅延が解消する」らしいことが分かったので,さっそく強引ですが,中断状態のアプリを終了するスクリプト(ps1)を書いてみました

$task=
  "Microsoft.Photos",
  "SystemSettings",
  "Calculator",
  "Video.UI",
	
for($i=0;$i -le $task.length-1;$i++)
{
  stop-process -name $task[$i] | out-null
}

これをショートカットキーに登録して,他のショートカットキーが遅延すると感じたときは,このスクリプトを呼び出してやると暫くの間は遅延が解消されます.
しかし,中断中のアプリを強引に消したりと,これ根本的な解決になってないですね...

また調べる

こんな書き込みが
sakebear.ddo.jp

原因は"Superfetch"サービスです。

Superfetchサービスについて,知らなかったので少し調べてみました.
とりあえず,Wikipediaから

Windows SuperFetch(ウィンドウズ スーパーフェッチ)とはWindows VistaWindows 7Windows 8/8.1、Windows 10に搭載されている、パフォーマンスの向上に関するディスクキャッシュ・メインメモリ管理機能である。

ユーザーの操作パターンと、アプリケーション(オフィスアプリケーション等)やバックグラウンドプロセス(ウイルス検索など)との挙動を記録・分析し、予測により効率的なメモリ管理を行う
例として、ユーザーが操作していない時間帯に、ウイルス検索がバックグラウンドで実施され、アプリケーションが使用するメモリがスワップアウトされたとする。SuperFetchはこれらの挙動を監視して、ウイルス検索が終了した後に、スワップアウトされたアプリケーションの使用メモリを再び、自動的に(予測的に)スワップインさせる。

Windows SuperFetch - Wikipedia

確かにこれっぽいですね
恐らくこいつがストアアプリを終了しても中断状態で留めていたのでしょう
ただ便利そうなこともしてるっぽいです.

Superfetchを止めてみる

Win+X→Gで,「コンピューターの管理」を起動→"コンピューターの管理"→"サービスとアプリケーション"→"サービス"の順に選択します.Superfetchの「スタートアップの種類」が恐らく自動になっているので,手動または無効に変更します.

これで起動時にSuperfetchが実行されないので,ショートカットキーの遅延がなくなりました

まとめ

Superfetchを起動しないようにしたら,ショートカットキーが素早く実行できるようになりました.
ですが,Superfetch実行しないことによる弊害も考えられるので,もう少し詳しく調べたいですねー