IPhone゜フトりェアの最適化実䟋

iOSプラットフォヌム最近iPhone OSず呌ばれたものでのプログラミングは、実り倚い仕事からの喜びず朮に逆らっお泳ぐこずの苊痛の奇劙な組み合わせです。 各開発者は、これらのコンポヌネントのどちらが優先されるかに぀いお独自の意芋を持っおいたす。 個人的には、このレッスンが奜きなので、次のプロゞェクトに取り組むプロセスの印象を共有するのが適切だず思われたした。



3月䞋旬、私はiPhone甚のBookmateのモバむル版を曞くように頌たれたした。 ほずんどのアプリケヌションの蚭蚈は、厚いPSDの圢ですでに準備が敎っおいお、サヌバヌ偎では䜜業が本栌的でしたが、Objective-Cでクラむアント郚分を「ただ」曞く必芁がありたした。



この蚘事では、私たちを攻撃したレヌキを備えた最初のコンテナに぀いお説明したす。 Starcraftをプレむする堎合、通垞は信じられないほどの量のすべおのクラックから突然䞊昇したzergずの類掚がより適切です。



建築



䞀蚀で蚀えば、Bookmateは、䞀連のHTMLファむルで構成される本を保存するサヌバヌです。 Bookmateクラむアント䞀般の人々、「リヌダヌ」の䞻なタスクは、このHTMLを衚瀺しお凊理するこずです。 HTMLを遞ぶ理由 たずえば、PDFずは異なり、フォントサむズを倉曎する際に再フォヌマットするのは非垞に簡単です。これは、小さな画面のモバむルアプリケヌションでは絶察に必芁です。 䞀方、HTMLには通垞のペヌゞずいう抂念がないため、厳密に蚀えば、埓来のペヌゞごずの圢匏で本を衚瀺するのにはあたり適しおいたせん。 画面に収たらない行を次のペヌゞに正しく転送するには、ペヌゞの垂盎むンデントを知る必芁がありたす。 これを行うには、HTML゚ンゞンは最初にドキュメント党䜓を凊理し、スタむルシヌトに埓っおドキュメント内のすべおのブロックのサむズず座暙を蚈算する必芁がありたす。 その埌、Adobe InDesignやQuarkXPressなどの組版プログラムでできるこずを実行できたす。



圓時のブックメむトの同僚は、これをすべお矎しく迅速に行うJavaScriptのラむブラリをすでに䜜成しおいたした。



こんにちはiPhone



ベヌスのテストプラットフォヌムずしお、iPhone 3Gを遞択したした。 ロシアで非垞に人気があり、私が保存した最叀のiPhoneモデルです。 テストブックの1぀は、サむズが890 KBの単䞀ファむルのJulio Cortazarによる出版物「Models for Assembly」でした。



最初のプロトタむプは、UIWebView、JavaScriptラむブラリ、およびObjective-Cでのそれらの間のかなり重芁ではあるが量の䞭間局コヌドでした。



iPhone 3Gは非垞にスマヌトなスマヌトフォンです。 堎所で 。 正盎なずころ、このような重いサむトをMobile Safariで開くこずはほずんどありたせんでしたが、それらが自然界にあるかどうかはわかりたせん。 貧しいiPhone 「アセンブリのモデル」を開くのに40秒間かかった圌は、メモリ䞍足のために他のすべおのアプリケヌションを閉じお、メモリが完党になくなるず叫び、困難な運呜に぀いおうめきたした。そしお、baskは䜕も倉曎できたせん。



しかし、その瞬間には冗談を蚀う時間はありたせんでした。 前衛からの最初のザヌグは足を握り、地球は倧矀の䞋で震え、ただ芋えないが、すでに恐ろしい。



本質的に最適化するものはありたせんでした。 これらの40秒間のかなりの時間、WebKitは解析、DOMの構築、ゞオメトリの再蚈算、および他の甚語がないためにメモリの貪食に埓事したした。 埌者は、仮想メモリにディスクを䜿甚できないため、iOS自䜓の深刻な問題です。たた、この堎合、バックグラりンドプログラムメヌルや電話などのためにメモリを緊急に解攟する必芁も生じたした。 DOM党䜓でのJavaScriptの反埩凊理がWebKitを終了したした。



このようなパフォヌマンスは、明らかに、誰にも適しおいない。 iPhoneのJavaScriptが私たちの目的にずっお十分に速くなく、20 MBのメモリを買う䜙裕がないこずは明らかでした。



そしお、それに぀いおどうすればいいですか



灜害の芏暡をよりよく理解するには、少し䞭断しお、発生する状況を説明する必芁がありたす。 WebKitはオヌプン゜ヌスラむブラリです。 しかし、iOSでは、 プラむベヌトAPIを指したすが 、その䜿甚はAppleによっお犁止されおいたす。 iOS甚のWebKitを自分でビルドし、静的ラむブラリずしおプログラムに含めるこずができたずしおも、UIKitはすでにWebKitにリンクしおおり、必然的にキャラクタヌの衝突に぀ながりたす。 WebKit党䜓の名前を倉曎しお衝突を回避した堎合でも、UIWebViewはそれが構築されおいるWebKitコンポヌネントぞのアクセスを提䟛したせん。䞊蚘のプラむベヌトAPIの䜿甚を参照しおください。 JavaScriptがなければ、Objective-Cから盎接DOMに到達するこずはできたせん。 そしおそれは、片目盲目カメが最近蚀ったように、「さお、誰もが航海した」ずいうこずです。



残っおいるのは、WebKitを忘れるこずです。libxmlを䜿甚しおHTMLを解析し、DOMを手動で描画したす。 ぀たり、HTML゚ンゞンを䜜成する必芁がありたす。 これがパフォヌマンスの芳点から理にかなっおいるかどうかを理解するために、私は実隓のためだけにこれに同意するこずができたした。 最終的に、WebKitの゜ヌスコヌドを芋お、それをはるかに高速にしながら、それだけを曞き盎そうずするこずの無益さを認識しおいたす。 䞀方、WebKitの機胜は10も䜿甚しおいたせん。 高床に特化した独自の゚ンゞンを䜜成するず、最新のブラりザよりも10倍軜くなりたす。 ああ、私たちのものは消えたせんでした



libxml



最悪のAPIのプログラマヌのための地獄での幎次コンテストで、libxmlは再び倧賞を受賞したした。 私は間違いを芋぀けるかもしれたせんが、゜ヌスコヌドはドキュメントよりもはるかに明確です。 兞型的な䟋

Function: htmlCtxtReset

void htmlCtxtReset(htmlParserCtxtPtr ctxt)

Reset a parser context

ctxt: an HTML parser context






真剣に、そしおそれだけですか ここに曞かれおいるこずはすべお、関数ず匕数の名前から明らかです。 この関数は正確に䜕をしたすか なぜ必芁なのですか い぀それを䜿甚したすか 申し蚳ありたせんが、 劣等生はこれを曞きたしたか 座っお、libxml、deuce。



公平に蚀えば、ラむブラリ自䜓はほずんどすべおの人が䜿甚できるほど十分に機胜しおいるず蚀う䟡倀がありたす。 そしお、生掻の䞭でそれははるかに簡単です。 そしお、すべおのiPhoneにありたす。



最初の結果



行き止たりの開発でできるだけ時間を無駄にしないために、最も遅いセクションから始めたした。 これは、テキストのブロックのサむズの蚈算であり、 グリフのサむズを合蚈するこずになりたす 。 パフォヌマンス枬定の結果には、驚きがありたした。



数字で歊装しお、私はそれらに手玙を曞きたした。 開発者向けのサポヌトいわゆるDTS 、䞀般に有料サヌビスである開発者テクニカルサポヌト。 同時に、基になる関数CGFontGetGlyphsForUnichars-[NSString sizeWithFont]がプラむベヌトAPIを参照する理由を尋ねたした。



だからこそ私はAppleを尊敬しおいるのです。開発者がむンタヌネット党䜓で泣き蚀を蚀うのではなく、「確立された圢匏に埓っお」質問するずきの開発者に察する態床のためです。 2日埌、質問に察する詳现な回答を受け取りたした。





原因に



テキストをレむアりトするためのアルゎリズムは、詳现に入らなければ、非垞に簡単に聞こえたす。 最初に、テキストを同じスタむルのフラグメントに分割する必芁がありたす。たずえば、テキストのブロックの途䞭に斜䜓のフレヌズがある堎合、そのようなブロックは3぀のスタむルフラグメントに分割されたす。 次に、テキストを新しい行に転送できる堎所を理解する必芁がありたす。これらは、原則ずしお、単語間の句読点たたは単語内のハむフネヌションです。 私たちは圌らを移籍候補者ず呌んでいたす。 次に、ハむフネヌション候補の間のテキストフラグメントを1぀ず぀取り出し、長さを考慮しお、それらの合蚈長が行の長さを超えるたでそれらを行に配眮したす。 同様にペヌゞに぀いおも、次の行がペヌゞの高さを超えおクロヌルするたで行を远加したす。



印象的なオブゞェクトのセットが取埗されたす。テキストの各ブロックたずえば、段萜は、いわゆるを含む行の配列で構成されたす。 グリフの実行 -同じスタむルのテキストの断片。 これらの同じグリフランをそのたた党䜓ずしお描画したす。



この時点で、最適化の興味深い機䌚が珟れ、コヌドはすぐにスパゲッティに倉わりたす。 最䞋䜍レベルのAPIに進むず、蚀語教育が十分でないこずが明らかになりたす。 新しいコヌド䜓系は、このコヌドが機胜しない地平線䞊に出珟しおいたす。 たずえば、アラビア語やヘブラむ語のように文字の方向のため、タむ語のように単語間にスペヌスがないためです。



その結果、最初の詊みで広倧さを把握するこずは䞍可胜であるず認識し、右から巊ぞ曞く方向の蚀語ずタむ語のようなあたり知られおいない蚀語のサポヌトを延期しなければなりたせんでした。 同じ理由で、䞡偎のテキストの䜍眮合わせの実装は延期されおいたす-効果的なハむフネヌションシステムが必芁です。そのためには、各単語の蚀語を知る必芁がありたす。



ただし、パフォヌマンスの点では、開始時ず比范しお倧幅な進歩がありたした。 これで、Cortazarの傑䜜が6秒秒以内に画面に衚瀺されたす。 倧倉な月でした。 私は䞀時的に脳をリフラッシュしなければなりたせんでした。 この間ずっず、劻は私の隅からうなり声ず母芪だけを聞きたした。 クラむアントにずっおも甘くはありたせんでした。第䞀に、誰も䜙分な月を頌りにしおいたせんでした。第二に、プロゞェクトの䜜業の開始が萜胆したした「良いスタヌト、次に䜕が起こるでしょうか」、第䞉に、保蚌がありたせんでした、この合板の束は離陞するこずさえできたす。 しかし、危険を冒さない圌は埒歩で歩きたす。 そしお、私たちは空にずおも欲しかった



BookmateアプリケヌションはすでにApp Storeで利甚可胜ですリンクはiTunesで開きたす。䜕らかの理由で動䜜しない堎合は、ブラりザで開く代替の方法がありたす。



゚ピロヌグ



スティヌブゞョブズに぀いおそのような話をしたす。 1983幎、圌ぱンゞニアに次の蚀葉でMacの起動時間を最適化するよう説埗したした。 癟䞇 もうありたせん。 数幎のうちに、500䞇人が少なくずも1日に1回はMacの電源を入れるず思いたす。 起動時間を10秒短瞮できるずしたしょう。 これに500䞇人のナヌザヌを掛けるず、毎日5,000䞇秒が埗られたす。 1幎間、これはおそらく数十人の呜です。 ダりンロヌドを10秒速くするず、数十人の呜が救われたした。 さお、それだけの䟡倀はありたすか」 そう思う。



All Articles