為什麼同一台電腦上 iPhone Simulator 比 Android Emulator 快這麼多?!

答案其實就在字面上的意義,首先讓我們瞭解一下 Simulator 跟 Emulator 各代表什麼意思?大家中文上雖然都通稱模擬器,但是實際上是略有不同的:


[image source]

Emulator

中文翻譯為「仿真器」。那麼仿真器的定義是什麼呢?讓我們來看看 Wiki 怎麼說:

An emulator in computing duplicates (provides an emulation of) the functions of one system using a different system, so that the second system behaves like (and appears to be) the first system. This focus on exact reproduction of external behavior is in contrast to some other forms of computer simulation, which can concern an abstract model of the system being simulated.

仿真器,指的是幾乎能夠百分之百地模擬某硬件或軟件系統的全部特性、
行為的裝置或程序。仿真是儘可能做到全方位的模擬,而且力求逼真,
有點欲將原型或模仿對象取而代之的味道。仿真更具體,接近實物
(也有說接近硬件的,但肯定不侷限於硬件)。
(參考自 http://www.cn-cuckoo.com/2009/12/08/emulator-and-simulator-1300.html)

Simulator

Wiki 上沒有明確的「Simulator」定義,但我們還是可以瞭解一下什麼是 Computer Simulation

A computer simulation, a computer model, or a computational model is a computer program, or network of computers, that attempts to simulate an abstract model of a particular system.

模擬器,指的是仿照真實的硬件、軟件、環境、條件,能夠在某種程
度上再現這些硬件、軟件、環境、條件的裝置或程序。模擬只是表面
上做做樣子,不會有真實的過程發生;但能夠給出反饋,多用於研究
和培訓。模擬更抽象,側重建模。
(參考自 http://www.cn-cuckoo.com/2009/12/08/emulator-and-simulator-1300.html)

講完了字面上的意思,我們已經稍微瞭解了這兩者之間有什麼不同,那麼回到 iPhone v.s. Android,為什麼一個要實作為 Simulator 而另一個要實作為 Emulator 呢?

讓我們來想想:Android 的整個系統都是開放原始碼的,也就是說開發者可能包含應用程式開發、框架開發、或是硬體驅動開發。代表說從軟體到硬體,我們都需要可以模擬出與真實裝置一模一樣的「正確」執行結果。

反過來看 iPhone ,會在 iPhone 上做開發的就只能應用程式的開發者,唯一目的就是程式最後可以在 App Store 上架,也就是說,開發者是在意我這個程式所呈現出來的畫面是什麼,底層硬體是如何運作都與我無關。

因為目的不同,所以採用的實作不同,因此導致最後的效能表現也大大不同!

兩者之間的綜合比較

關於兩者的比較,有興趣的也可以看看這篇文章

iPhone Simulator:

  1. 執行在 native x86 環境之上,也就是說,電腦越快,你的模擬器效能就相對地越高。
  2. 一般來說,在模擬器上的表現都會比手機上還好。
  3. 有可能安裝到手機上後才發現表現不如預期,或甚至因為裝置上的記憶體配置不同才發現模擬器上沒發現的錯誤。

Android Emulator:

  1. 執行在 QEMU 模擬出的硬體之上,以就是說,電腦越快,你的仿真器效能也未必較高!端看你模擬出來的硬體極限而定。(一般在 Android Emulator 中,都是模擬 ARM926EJ-S rev 5)
  2. 一般來說,手機上的表現大多比仿真器上還好,尤其是在有圖形硬體加速的裝置上。
  3. 撰寫驅動程式(HAL)的開發者,可以保證在仿真器上的執行結果幾乎會與裝置上相同。
  4. 唯一會比裝置上還快的就是 I/O ,因為仿真器上直接存取磁碟,而裝置上則是存取 Flash,詳細的比較可以參考 Google I/O 上的議程

瞭解了這些原因之後,以後用 Android Emulator 就稍微忍一下吧!(苦笑)

**備註:**QEMU 可以支援 binary translation (for kernel code) 以及 native execution (for user code),但是為什麼 Android Emulator 還是跑不快,這可能是因為:

  1. Android 的 QEMU 版本未必是最新
  2. QEMU 並沒有模擬出 GPU
  3. QEMU 只看單顆核心的頻率高低,因為目前尚未支援多核心(也就是說不會因為核心數變多而變快),參考 wiki :「For full system emulation, QEMU uses a single thread to emulate all the virtual CPUs and hardware. 」