最近は Surface Pro X (Windows on ARM) について色々と調べたり、アプリケーションをデプロイして試したりしてますが、やはりパフォーマンスを考えると ARM64 への対応が必要だと再認識しているのと、どうにも誤解が多そうなのでまとめました。
基本的な Surface Pro X の情報は既に購入時のレポートに書いたので参照してください。
既に知られている通り x64 には対応していないですが、x86 と ARM32 は WOW64 によって対応しています。
WOW64 のドキュメントにはひっそりと ARM64 に関する情報が追加されています。
WOW64 Implementation Details - Win32 apps | Microsoft Docs
- (ARM64 only) xtajit.dll contains the x86 software emulator.
- (ARM64 only) wowarmw.dll provides support for running ARM32 programs on ARM64.
WOW64 による ARM32 と ARM64 の関係は x86 と x64 の関係と同じです。
結果として Surface Pro X は ARM64 / ARM32 / x86 の 3 つの CPU アーキテクチャに対応したアプリケーションを実行できますが、以下に軽くまとめたように動かし方が異なっています。
- ARM64
- ネイティブ実行
- ARM32
- WOW64 で実行
- x86
- WOW64 + エミュレーションで実行
ARM32 の WOW64 でのパフォーマンスがどのくらい ARM64 と差が出るのかは確認が難しいですが、確実に x86 の WOW64 + エミュレーションよりは速いです。
ここまでの内容を頭に入れておくと、System32 周りのディレクトリの意味が分かってきます。
何回見ても面白い pic.twitter.com/AdSgMoML00
— しばやん (@shibayan) 2019年11月15日
ここから先は Surface Pro X でそれぞれの CPU アーキテクチャに対応したアプリケーションを、実際に動かしてみた例になります。窓の杜がいつの日にか ARM64 対応の一覧を作ってくれることを願います。
ARM64 (ネイティブ)
当然ながら WOW64 やエミュレーションによるオーバーヘッドが存在しないので、理論上は ARM64 に対応したアプリケーションが Surface Pro X 上は一番快適かつ効率的に動作するはずです。
Chromium Edge (Canary)
確実に Surface Pro X 向けと思うタイミングで Chromium Edge の ARM64 対応バージョンが出ました。
We're pleased to announce that Microsoft Edge for ARM is now available in the Canary channel! Canary is now built natively for the ARM64 architecture that powers some Windows 10 devices, including the new Surface Pro X. It will soon come to the Dev and Beta channels as well. pic.twitter.com/cKg1H3Utfd
— Microsoft Edge Dev (@MSEdgeDev) 2019年11月13日
バージョンを確認しても 64bit と書いてあるだけで、特に ARM64 という感じはしないです。
64bit とは書いてあるけど ARM かどうかの記載はない pic.twitter.com/liBcBb75Hm
— しばやん (@shibayan) 2019年11月14日
同時に Beta もインストールしていたので比較しましたが、明らかにアプリケーションの起動速度とページ表示速度が向上していたので、ブラウザは ARM64 対応が必須という感じがしました。
Firefox (Beta)
Firefox も Beta ですが ARM64 に対応したバージョンがリリースされています。Chromium Edge より全体的にキビキビ動いてる感じがしましたが、ベンチマーク的には Chromium Edge のが上のようでした。
Chromium Edge と同じくバージョン情報では 64bit とあるだけですが、ちゃんと ARM64 で動いてます。
ARM64 版 Firefox pic.twitter.com/FpfakvE0LC
— しばやん (@shibayan) 2019年11月15日
対応開始から 1 年近く経っているからか、完成度は Chromium Edge より高いと感じました。正式版がいつ出るのかは軽く調べましたが分かりませんでした。
Windows Terminal (Preview)
新しいアプリだけあって最初から ARM64 に対応しているのは偉いと思いました。
問題なく動くので特筆するべきことはないです。ぶっちゃけ x86 でもあまり変わらない気も…。
VLC for Windows
ARM64 に対応したアプリケーションを探していたら、VLC for Windows が見つかりました。ちなみに Store 版は ARM32 への対応なので、Windows 10 Mobile 向けのおこぼれという感じです。
ビルドが去年から更新されていなさそうなので今後が少し心配ではありますが、非常に低い負荷でメディアの再生が可能なので結構良い感じでした。
WSL (Ubuntu / Debian / Fedora Remix など)
WSL 向けのディストリビューションはそこそこ ARM64 対応がされているので選択肢が多いです。
来年リリース予定の WSL2 でも仮想化に対応していれば ARM64 でも使えるようです。
ちなみに Surface Pro X は仮想化に対応しているっぽいので、WSL2 の実行も可能でしょう。
ARM32 (WOW64)
元々 ARM32 だけに対応した Windows 10 PC は存在しないので、UWP で Windows 10 Mobile 向けにビルドされていたバージョンがダウンロード出来るケースぐらいかなと思います。
前述したように ARM32 の場合は CPU のエミュレーションではないので性能は比較的良いです。
Minecraft for Windows 10
何故か Minecraft for Windows 10 は ARM32 向けのビルドが提供されていました。体験版をインストールして試してみましたが、快適に遊べましたし CPU 使用率はかなり低かったです。
ゲームなのでそれなりに GPU は使っていましたが、適当に弄った範囲では処理落ちなどしませんでした。
GPU 周りはオーバーヘッドが少なそうなので、x86 エミュレーションを避けて Direct3D が中心に使われている分には割とゲームは動きそうな気配がしました。ちなみに SQ1 は DirectX FL 11.1 の対応です。
x86 (WOW64 + エミュレーション)
数々のレビューで指摘されているのが x86 のパフォーマンスについてですが、一応 x86 => ARM64 への変換はキャッシュしていたり、それ以外にも最適化を施しているようですが限界があります。
アプリケーションがそもそも正常に動作しない場合は、ファイルのプロパティから互換性設定を弄ることが出来ます。トラブルシューティングツールを使っても良いみたいです。
プリインストールされているアプリケーションは殆どが ARM64 もしくは ARM32 なので、大体はあとからインストールしたアプリケーションが該当します。
Office 365 / OneDrive
Surface Pro X を購入すると最初から Office 365 の体験版が入っていましたが、実体は x86 版の Click-to-Run でした。おそらく ARM64 版がリリースされることは無さそうです。
x86 エミュレーションはオーバーヘッドが大きいですが、Office 系はめちゃくちゃ CPU を使うというわけでもないので、特に問題なく利用できました。この感じでは ARM64 対応はコスパ悪そうです。
iTunes
最近はアップデートが面倒なので Store から入れてますが、x86 に対応してるので問題なく動きます。
ただし、再生時の CPU 使用率がちょっと高いかなーという印象ですが、元々 iTunes は CPU を結構食うだけな気もします。タッチ操作もしにくいし、ちょっと悩むところです。
Electron ベースのアプリ (Slack / Visual Studio Code など)
まだ Slack や Visual Studio Code のベースになっている Electron が ARM64 に対応してないので、x86 エミュレーションで動作しますが ARM64 対応は既に完了しているようです。
同時に Node.js の ARM64 対応も中の人によっていろいろ行われたらしいです。
使われている Electron のバージョンが上がれば、ARM64 に対応されるアプリも出てきそうです。多分 Visual Studio Code は対応が行われる流れだと思います。
.NET Framework ベースのアプリ
最初は ARM64 向けのランタイムが用意されているのかと思っていたのですが、実機で確認すると x86 のランタイムしか入っていなかったので、ARM64 への対応は不可能になりました。
将来的には .NET Core が Windows 10 の ARM64 に対応すると思われるので、そっちに移行しない限り x86 エミュレーションからは逃れられないようです。とても残念です。
長々と書いてきましたが、個人的には Surface Pro X は Always Connected PC かつ ARM64 という面白い石が載っていて長時間稼働が出来、デバイス自体は薄型軽量で狭ベゼルかつファンレスでデザインも良いので気に入っています。実際ハワイまで買いに行って良かったです。
アプリ側の対応ですが Apple のように 64bit 必須に出来れば良いのでしょうが、Surface Pro X がバカ売れしてベンダーが対応せざるを得ないという状態にならないと難しいでしょう。