この記事が突っ込みどころが多いと話題になっています。初期の頃はiOSのなめらかな動きと比べたらAndroidは劣化版と言われても反論できない感じでしたが、Nexus 4/Nexus 5ともなるとだいぶ快適で乗り換えても違和感なく使えるようになりましたが、同じぐらいの快適さが得られるハードウェアを比べてみると、メモリも半分で、コア数も半分で、クロック周波数も半分で、バッテリーにやさしいハードウェアになっていることは確か。なぜそれでやっていけるのか、ということについて僕なりの理解をまとめます。元の英語記事は読んでません。
メモリ管理方式の違い
Androidはマーク・アンド・スイープ方式のGCで、iOSはNSAutoreleasePoolにしろ、ARCにしろ、基本的にリファレンスカウントです。リファレンスカウントはプリミティブなGCです。マーク・アンド・スイープは処理全体を止めるので、あまり発生させたくないです。そのため、同じようなプログラムを実行して同じようなユーザ体験を得るためにメモリを多めに積んで置いてGCさせないようにするのはあるかと思います。また、断片化したメモリの対策もないので、徐々に性能が落ちると評判でしたし。あと、Androidは2.3あたりからコンカレントGCが入ったという記事を見かけます。コンカレントGCだとGC用スレッドが別に動くのでマルチスレッド性能もしくはCPU速度が欲しくなりますよね。
Android 5.0だとパーシャルマーク・アンド・スイープでGCが改善して停止時間が短くなっていたり、断片化の解消の機能が入るらしいので、少ないメモリで動かした時の快適さは改善するんじゃないでしょうか。
VM方式か、ネイティブ方式か
Androidは長らくDalvik VMでした。iOSは、C言語にオブジェクト指向ランタイムを乗っけたObjective-C。ネイティブの方が当然パフォーマンスは良いのでクロック周波数を無理にあげなくても大丈夫です。VM方式はそのままでは遅いのでJITを使って高速化を行います。こうすると、バイトコードと同じ役割のネイティブコードがメモリにいたり(確証はないけど、たぶんバイトコードの開放はしてない気がする)、JITするホットスポットを見つけるためのログを保存したり、JITコンパイラ自身がメモリにいたり、メモリにはやさしくないことは確か(そこまでメモリは使わないという話も聞くけど)。また性能もネイティブに比べると劣る。
Android 5.0から事前コンパイルをするARTが搭載されます。中間コードをネイティブにする方式と、最初からネイティブだと、後者のほうがまだパフォーマンスは良いとは思いますが、ベンチマークの性能もだいぶ上がっているとのことなので(自分では測ってない)、CPUのクロックをもっと下げても快適な動きをするようになると思います。記事によってはメモリ消費量は犠牲になるという気になることを書いているのもあるので、まだiOSの方が多少は有利だと思いますが。
バックグラウンドタスク
Androidの方がバックグラウンドでやれることが多く、iOSの方が少なかったので、コア数やメモリが少なくても問題なかったというのはあると思います。メモリが半分というのはここが一番大きな差かな、と思っています。ただ、iOSも少しずつこのあたりの機能が増えてますし、どちらも通知機能がリッチになっていく方向に進化しているので差は減ってくると思います。
解像度
Retinaを打ち出したAppleの方が最初でしたが、その後はAndroid勢の方が解像度アップに積極的で、Full HDはおろか、MacBook Pro 13 with Retina並みの解像度の端末まで出てくる始末。解像度って液晶の消費電力にも影響あるし、メモリも食うし(VRAMが別にあれば問題ないと思うけど)、GPUの負荷もあがります。当然性能にも影響あります。直近の例だと、Nexus 9とShield Tabletですね。同じTegra K1だけど、解像度が小さいShield Tabletの方がフレームレートが上がります。算数の世界の話。
個人的にはiPhone 5の細かさで全然問題ないので、これ以上上げないで欲しいです。
まとめ
スペックに影響がありそうなところを適当にピックアップしました。これ以外にも、3GS時代にはAndroidにはストレージ速度の問題がありました。Galaxy S初代と3GSでは体感で倍以上違う感覚がありました。その分、データを事前にメモリにロードしておかないと、みたいな作りが必要でした。また内蔵メモリが少なくて、より低速なSDカードを使わせる機種も多かったですからね。今どきはそこまでストレージ速度に差はないみたいです。
元記事見てもiOSにメモリが1GBしかない理由がかかれてないというツッコミもありますが、どちらかというと、Androidが性能差を埋めるために必要なメモリ量が2GBでした、という方が近いのかなという気がしました。今後のARTのこなれ具合と、64ビット化でこの差がどれだけ縮まるのかは個人的に愉しみにしています。