Nativní kód v cloudu

29. 10. 2011 16:11 (aktualizováno) zboj

Listopadový .NET Magazin (německé vydání) je věnován cloudu, převážně platformě Azure. Protože Azure je ve srovnání s podobnými službami relativně drahý, byl jeden článek věnován optimalizaci. Kromě samozřejmých věcí jako minimalizace přenášených dat a počtu přístupů do databáze je velice zajímavou technikou použití nativního kódu. Při nastavení Full Trust lze na Azure využívat pomocí P/Invoke nativní DLL knihovny.

Údajná úspora je cca. 30–50% spotřeby paměti, takže s jednodušší aplikací nebo webovou službou se snadno vejdete do výrazně levnější instance ExtraSmall. P/Invoke ale zahrnuje ne vždy zanedbatelnou režii při přechodu mezi řízeným a nativním kódem. Navíc nativní implementace STL je dost pomalá (nevyužívá možností C++11). Proto jsem zkusil, jak na Azure funguje C++ přeložené do CIL.

Kód použitý v nativní knihovně lze bez úprav přeložit do CIL, pokud přidáme veřejné řízené rozhraní (public ref class). Vznikne tak DLL bez nativního kódu, která může využívat STL pro .NET. STL.NET je výrazně rychlejší než nativní STL ve VS2010 (je kompletně přepsaná a využívá nových možností C++11, např. std::move). Navíc odpadá režie při volání nativního kódu.

S nasazením na Azure 1.15 není problém, pokud dodáte msvcr100.dll a msvcp100.dll (je nutné použít 64-bitovou verzi, jinak služba vyhodí výjimku BadImageFormatException). Úspora 30–50% se může zdát zanedbatelná, ale pokud máte aplikaci nebo službu náročnou na výpočetní výkon a/nebo paměť, je při vyšší návštěvnosti rozdíl, jestli za měsíc zaplatíte 1000 korun, nebo 500–700.

Sdílet