{{page>courses:b6b36pjc:styles#common&noheader&nofooter}} {{page>courses:b6b36pjc:styles#cviceni&noheader&nofooter}} ===== Cvičení 13: Optimalizace ===== Pokud se zajímáte o C%%++%%, nejspíše vás zajímá výkon vašeho programu. Dosáhnout vysokého výkonu je v C%%++%% možné, ale ne vždy snadné; jediné špatné rozhodnutí může dělit efektivní kód od plazícího se slimáka. * Stáhněte si {{:courses:b6b36pjc:cviceni:cviceni_13_init.zip|výchozí kód}}, postavte ho a seznamte se s obsahem jednotlivých souborů. * Spusťte program s parametry "40 200". Porovnejte obrázky ''in.png'' a ''out.png''. Zapište si, jaký počet milisekund program vypsal. * Upravte program tak, abyste dosáhli co nejvyššího výkonu. ==== Obecné rady pro efektivnější program ==== * Zapněte //release build//, příp. použijte nastavení kompilátoru ''-O3''. * Vždy si ověřte, že změna programu způsobila zrychlení výpočtu. * Vždy si ověřte, že po změně programu výpočet proběhl správně. * Pokud nevíte, co zrychlit, použijte //profiler//. Ve Visual Studiu je profiler vestavěný, alternativou je program //VerySleepy//. Na Linuxu použijte např. příkaz ''perf'': perf record a.out perf report -g "graph,0.5,caller" ==== Konkrétní rady pro tento program ==== * Opravdu jste nezapomněli zapnout release build? * Co je rychlejší, dělení nebo násobení? Jak by toho šlo využít v tomto programu? {{:courses:b6b36pjc:cviceni:cviceni_13_mult.zip|Řešení}} * Je možné, že se v podmínce cyklu něco vyhodnocuje zbytečně? * Dal by se provést takový předvýpočet, aby se v náročném cyklu vůbec nepoužívaly proměnné typu ''double''? {{:courses:b6b36pjc:cviceni:cviceni_13_lut.zip|Řešení}} * Co je rychlejší, násobení nebo sčítání? Jak by se toho dalo využít pro zrychlení iterace v cyklu? {{:courses:b6b36pjc:cviceni:cviceni_13_iter.zip|Řešení}}