\par Porovnání programového řešení této bakalářské práce s~knihovnou Yaramod-v3 bylo prováděno na stroji s~architekturou x86\_64, operačním systémem Ubuntu 22.04.1, procesorem Intel Core i7-9850H 2,6\,Ghz a~s~32\,GB RAM. Mezi jednotlivými experimenty byla promazávána cache pomocí \inlinecode{sync; echo 3 > /proc/sys/vm/drop_caches}, aby se tak minimalizoval její vliv. Nejdříve byly porovnány knihovny jako takové z~hlediska nároků na strojový čas. Při tomto porovnání byl měřen čas analýzy samotné pomocí funkce \inlinecode{getrusage} z~hlavičkového souboru \inlinecode{sys/resource.h}. Poté bylo provedeno porovnání odezvy dosavadní implementace projektu YLS a~YLS po integraci s~knihovnou Yaramod-v4, kde byla součástí porovnání jednak samotná analýza, ale také přístup k~jejím výsledkům a~kvalita integrace.

\section{Yaramod-v4}
\par Pro porovnání výkonu obou knihoven byl pro každou z~nich vytvořen triviální program, jenž provádí analýzu zdrojového kódu a~následnou reanalýzu jeho modifikované verze. U~programu pro knihovnu Yaramod-v4 byl využit inkrementální přístup, přičemž pozice změn v~souboru byla ohlášena pomocí argumentů programu. Dosavadní řešení, knihovna Yaramod-v3, takovou možnost nenabízí, a~tudíž byl zdrojový kód a~jeho modifikovaná verze analyzovány konvenčním způsobem. Pro provádění experimentů byly vybrány čtyři reálné sady pravidel, jež používá pro svoje účely firma Avast. Každá z~těchto sad měla jiné charakteristiky, které jsou popsány v~tabulce \ref{tab:bechmarking_files}.

\bgroup
\def\arraystretch{1.3}
\begin{table}[]
    \centering
    \begin{tabular}{c|c|c|c}
        Sada pravidel & Celková velikost & Celkový počet pravidel & Počet souborů\\
        \hline
        \inlinecode{small.yar} & 11,2\,kB & 12 & 1\\
        %\hline
        \inlinecode{medium.yar} & 795\,kB & 1818 & 1\\ 
        %\hline
        \inlinecode{big.yar} & 14,4\,MB & 16260 & 1\\
        %\hline
        \inlinecode{includes.yar} & 1,8\,MB & 2810 & 365\\
        \end{tabular}
        \caption{Popis sad pravidel použitých pro porovnání knihovny Yaramod-v3 a~programového řešení této bakalářské práce, knihovny Yaramod-v4}
    \label{tab:bechmarking_files}
\end{table}
\egroup

\par První tři sady jsou charakterem velmi podobné. Liší se hlavně svým rozsahem a~počtem používaných modulů. V~praxi bývají rozsáhlé sady pravidel realizovány pomocí propojování zdrojových souborů konstrukcí \inlinecode{include}. Jednotlivé soubory pak zpravidla obsahují pouze několik pravidel, která spolu souvisí. Tento případ je zde zastoupen čtvrtou sadou \inlinecode{includes.yar}. Modifikací bylo v~jejím případě přidání jednoho pravidla do náhodného zdrojového souboru v~testovací sadě.
\par Modifikací zdrojového kódu bylo buďto přidání celého nového pravidla, nebo jeho odebrání. Zdrojové kódy byly před i~po modifikacích syntakticky a~sémanticky správné, neboť kvůli rozdílným chováním obou řešení při nálezu chyby by je jinak nebylo možné objektivně porovnat. Obě knihovny byly přeloženy v~konfiguraci \inlinecode{Release}, aby byly aktivovány případné optimalizace překladačem.
\par Výsledky porovnání můžeme vidět v~tabulce \ref{tab:ymod_evaluation}. Vidíme, že za cenu malého zpomalení při prvotní analýze (dosavadní řešení je 1,22\,--\,1,75$\times$ rychlejší), dokáže nové řešení reanalyzovat modifikovaný zdrojový kód výrazně rychleji. S~rostoucí velikostí sady pravidel se zrychlení oproti dosavadnímu řešení ještě více zvyšuje. U~velmi rozsáhlé sady je knihovna Yaramod-v4 rychlejší více než 177$\times$. V~případě sady \inlinecode{includes.yar} je nové řešení během reanalýzy rychlejší dokonce více jak 2000$\times$. Tohoto zajímavého výsledku je dosaženo pomocí cache zdrojových souborů, kterou uchovává objekt třídy \inlinecode{YaraSource}. Díky této cache se reanalyzuje pouze modifikovaný soubor a~ostatní jsou ignorovány, neboť v~nich nedošlo k~žádným změnám. To je také patrné z~toho, že čas opětovné analýzy v~tomto případě přibližně odpovídá času, jenž je potřebný pro opětovnou analýzu malého zdrojového souboru.  
\par Dle uvedených výsledků lze usoudit, že vytvořená knihovna je skutečně vhodná pro použití právě ve spojení s~textovými editory a~IDE. Za cenu mírně pomalejší prvotní analýzy, která může být prováděna např. při otevření zdrojového souboru, získáváme výrazněji rychlejší reanalýzu modifikované sady pravidel. Ta je dostatečně rychlá natolik, aby mohla být prováděna po přidávání jednotlivých znaků i~v~případě velmi rozsáhlých sad pravidel v~jazyce YARA.  

\bgroup
\def\arraystretch{\tabpadding}
\begin{table}[h]
    \centering
    \begin{tabular}{c|c c|c c|c c}
        \multirow{2}{*}{Sada pravidel} & \multicolumn{2}{c|}{Yaramod-v3 (s)} & \multicolumn{2}{c|}{Yaramod-v4 (s)} & \multicolumn{2}{c}{Zrychlení} \\
        & \small{Analýza} & \colorbg{\small{Reanalýza}} & \small{Analýza} & \colorbg{\small{Reanalýza}} & \small{Analýza} & \colorbg{\small{Reanalýza}}\\
        \hline
        \inlinecode{small.yar} & 0,008 & \colorbg{0,006} & 0,014 & \colorbg{0,0003} & 0,57 & \colorbg{20} \\ %6824, 6824; 10188,10776
        %\hline
        \inlinecode{medium.yar} & 0,336 & \colorbg{0,204} & 0,385 & \colorbg{0,002} & 0,87 & \colorbg{102} \\ %54780, 55156; 85232, 159796
        %\hline
        \inlinecode{big.yar} & 3,449 & \colorbg{4,083} & 4,224 & \colorbg{0,023} & 0,82 & \colorbg{177,52} \\ %1 180 024, 1 180 024; 1440628, 2857408
        %\hline
        \inlinecode{includes.yar} & 1,075 & \colorbg{0,973} & 1,152 & \colorbg{0,0004} & 0,93 & \colorbg{2432,5} \\ %125944, 125944; 154048. 299836
        \end{tabular}
        \caption{Porovnání časů potřebných k~analýze jednotlivých testovacích sad knihovnou Yaramod-v3 a~novým řešením, knihovnou Yaramod-v4\,--\,Jedná se o~součty systémových časů a~uživatelských časů. Zrychlení bylo vypočítáno jako podíl času potřebného pro (re)analýzu knihovnou Yaramod-v3 a~knihovnou Yaramod-v4.}
    \label{tab:ymod_evaluation}
\end{table}
\egroup


\section{Yara Language Server}
\par Oproti dosavadní implementaci YLS, využívající Yaramod-v3, došlo po integraci knihovny Yaramod-v4 ke zlepšení zejména ve třech aspektech, co se funkcionality týče. Tím prvním je odolnost vůči chybám ve zdrojovém kódu při provádění statické analýzy. Dosavadní řešení ukončilo analýzu kódu vyhozením výjimky při nalezení první chyby. Pozice chyby a~její popis byly extrahovány z~řetězce výjimky pomocí regulárních výrazů. 
\par Nové řešení umožňuje identifikovat více než jednu chybu v~dokumentu (ať už se jedná o~syntaktické nebo sémantické chyby) a~chyby jsou reprezentovány jako objekty, které disponují rozhraním pro získání jejich popisu a~pozice v~dokumentu. Není tedy nutné používat regulární výrazy pro určení těchto údajů.
\par Dále je díky použití Yaramod-v4 možné analyzovat zdrojový kód přímo z~řetězce. Díky tomu lze provádět analýzu rozpracovaných dokumentů, které dosud nebyly uloženy. To souvisí také s~třetím aspektem, v~němž se projekt YLS díky Yaramod-v4 zlepšil, a~sice s~prováděním statické analýzy během editace zdrojového kódu.
\par Analýza je prováděna po jednotlivých editacích, čímž je uživateli poskytnuta okamžitá zpětná vazba. To je kromě možnosti provádět analýzu řetězce umožněno také nízkou latencí analýzy, za kterou vděčíme inkrementálnímu přístupu.
\par V~tabulce \ref{tab:yls_evaluation} vidíme porovnání implementace YLS s~využitím Yaramod-v3 (dosavadní řešení) a~nové implementace, která využívá knihovnu Yaramod-v4 z~hlediska času potřebného pro poskytnutí dané funkcionality.

\bgroup
\def\arraystretch{\tabpadding}
\begin{table}[h]
    \centering
    \begin{tabular}{c|c|c|c|c}
        \multicolumn{2}{c|}{Funkcionalita YLS} & Yaramod-v3 (s) & Yaramod-v4 (s) & Zrychlení \\
        \hline
        \multirow{2}{*}{Linting} & \small{Počáteční} & 7,750 & 4,784 & 1,62 \\
        %\cline{2-5}
         & \colorbg{\small{Po úpravě}} & \colorbg{8,365} & \colorbg{0,056} & \colorbg{149,38}  \\
        \hline
         \multirow{2}{*}{DocumentSymbol} & \small{Počáteční} & 6,514 & 3,673 & 1,77 \\
        %\cline{2-5}
        & \colorbg{\small{Po úpravě}} & \colorbg{6,303} & \colorbg{3,723} & \colorbg{1,69} \\
        \hline
        \multicolumn{2}{c|}{Completion} & 1,147 & 1,177 & 0,97
        \end{tabular}
        \caption{Porovnání odezvy YLS při poskytování funkcionality\,--\,V~prvním sloupci jsou odezvy implementace, která využívá Yaramod-v3, a~ve druhém jsou odezvy implementace YLS, jež využívá knihovnu Yaramod-v4. Třetí sloupec udává zrychlení nové implementace vůči dosavadnímu řešení (vypočítáno jako podíl odezvy dosavadního řešení a~nového řešení).}
    \label{tab:yls_evaluation}
\end{table}
\egroup


\par Pro měření časů uvedených v~tabulce byla použita sada pravidel \inlinecode{big.yar} z~předchozí kapitoly. Úpravou bylo vložení nového pravidla. V~obou případech bylo vkládáno na stejné místo v~dokumentu. Čas byl měřen od příchodu notifikace na server až po odeslání odpovědi zpět. U~lintingu se v~případě Yaramod-v3 jednalo o~notifikace typu \inlinecode{didOpen} a~\inlinecode{didSave}, které právě tuto funkcionalitu aktivují. U~nové verze knihovny se sledovala odpověď na notifikace \inlinecode{didOpen} a~\inlinecode{didChange}, neboť linting je prováděn po každé úpravě dokumentu. Díky tomu je také v~tomto případě do času potřebného k~opětovné inkrementální analýze započítán i~čas potřebný pro ohlášení změn v~dokumentu.
\par Z~tabulky vidíme, že nové řešení exceluje zejména v~provádění lintingu zdrojového kódu po jeho úpravách, kdy dokázalo obsloužit danou událost více jak 149$\times$ rychleji než dosavadní. Dále vidíme, že ačkoliv z~předchozího porovnání vycházela při počáteční analýze o~něco lépe knihovna Yaramod-v3, zde takřka ve všech případech vítězí YLS s~využitím knihovny Yaramod-v4. Tento výsledek je způsoben tím, že během obsluhy událostí v~dosavadním řešení provádí knihovna Yaramod-v3 více běhů statické analýzy. To alespoň v~rámci nové implementace není pro zajištění požadované funkcionality nutné. Počet běhů analýzy byl proto redukován na minimum, což ušetřilo čas v~případech, v~nichž by jinak byla knihovna Yaramod-v4 pomalejší. U~funkcionality Completion jsou výsledky obou implementací podobné, protože ani v~jednom případě není analýza prováděna a~přistupuje se pouze k~výsledkům analýzy získaným během jejího posledního běhu.
\par Z~pohledu uživatele jsou skutečné časy odezvy obou implementací o~něco vyšší než ty uvedené v~tabulce, protože čas potřebný pro výměnu dat těchto objemů mezi klientem YLS a~samotným YLS je řádově v~desetinách vteřin. 
