Hlavní navigace

Jak chce Microsoft zvýšit výkon Windows 8

8. 12. 2011 12:28 (aktualizováno) | zboj

V souvislosti s nedávným představením Windows Store se opět píše o Windows 8. V únoru má být k dispozici beta verze a vývojářům bude umožněno nabízet v novém obchodě aplikace (v beta verzi zatím pouze zadarmo). Protože jádro Windows 8 je zcela překopané, neuškodí shrnout si některé poznatky o novém systému. Nebudu psát o novém UI (Metro), jež je věcí osobního vkusu. Zaměřím se na to, jak chce Microsoft zvýšit výkon aplikací běžících nad novým Windows Runtime (WinRT).

Nativní kód

Staré, ale stále používané Win32 API má nahradit WinRT. Jedná se o objektově orientované API napsané v C++. Rozhodování mezi Win32 a .NET dopadlo stejně, jak kdysi církev vyřešila problém dvou papežů: zvolili třetího.

WinRT je založené na technologii COM, již už všichni považovali za překonanou. V případě komponent z WinRT API (a komponent třetích stran) se jedná o staré dobré COM objekty zkřížené s metadaty z .NET. Tato metadata (pro účely WinRT je překladač zapisuje do souborů s příponou winmd) umožňují využití nativních komponent z řízeného kódu mnohem efektivněji než přes P/Invoke.

Vývojářům nabízí Microsoft pro Metro API v C++. Nebyl by to ale Microsoft, aby si nevymyslel něco extra. Vzniklo tak C++/CX (CX=Component Extensions), které rozšiřuje syntax C++ právě o ony renovované COM komponenty. Syntax je z větší části převzata z C++/CLI (pokud nesnášíte nestandardní rozšíření, můžete psát v čistém C++ s využitím knihovny WRL).

Dobrou zprávou je, že Visual Studio 2011 (současné preview) podporuje velkou část nového standardu C++11. Oficiální stanovisko Microsoftu je, že vývojáři by měli psát svůj kód v čistém C++ a rozšířenou syntax používat je pro komunikaci s novým API nebo s UI (které se definuje v již používaném deklarativním jazyce XAML).

Paměť

Jak na svém blogu sdělil Steve Sinofsky, Microsoft došel po „rozsáhlém výzkumu“ k závěru, že v telefonech a tabletech je nejlepší mít co nejméně paměti. Ne že by to zrychlilo systém či aplikace, ale šetří se tak baterie. Celé WinRT je proto navržené tak, aby pamětí neplýtvalo. Předně nemá garbage collector. To lze samozřejmě obejít (UI lze napsat v .NETu nebo Javascriptu), ale narozdíl od CLR není GC součástí runtimu.

Asynchronní API

Náročnější operace se dají ve WinRT provádět pouze asynchronně (např. práce se soubory). Nové rozhraní IAsyncOperation<> se přitom stará o předávání výsledků. C# nově dostalo klíčová slova async a await, aby mohli vývojáři psát vlastní asynchronní metody způsobem, na který jsou zvyklí (sekvenčně).

Pokud přesně nevíte, o co jde, doporučuji podívat se na NodeJS a jeho způsob práce s callbacky. Trochu zamrzí, že Microsoft ignoroval možnosti, které poskytuje nové C++11 (např. std::future) a vytvořil si vlastní, nekompatibilní API.

Jak je na tom .NET?

.NET se ve Windows 8 dostává na vedlejší kolej, ale pořád je možné jej volitelně využívat (CLR může běžet nad WinRT, ale standardní API, tedy knihovna BCL, je osekané). Pokud máte hodně kódu, bude snadné upravit jej (pokud se netýká UI) pro .NET v Metru (úplně beze změn to bohužel většinou nepůjde).

Předpokládám, že Microsoft napíše nový JIT překladač pro procesory ARM, protože v současné době běží .NET na ARM neuvěřitelně pomalu, zatímco na Intelu řádově stejně rychle jako nativní kód. Jenže .NET Micro Framework je okrajová záležitost, kdežto na Windows 8 sází MS svou budoucnost. Doufám, že to dopadne lépe než na Androidu, kde podle vyjádření společnosti ARM běží nativní kód vygenerovaný jejich vlastním překladačem 4× rychleji než kód nad Dalvik VM.

NB: Že to celé funguje, dokazuje preview verze Win8, která bootuje podstatně rychleji než Windows 7 (ovšem zatím jí toho dost chybí) a vystačí si s podstatně menším množstvím operační paměti.