From 36c19205eed9cbea1fe77d6ec58181664b6d8c4f Mon Sep 17 00:00:00 2001 From: pihai Date: Sun, 12 Mar 2017 12:23:48 +0100 Subject: [PATCH] added section about task-callback bridge --- doc/thesis/chapters/serverless.tex | 25 +++++++++++++++++++ doc/thesis/hgblistings.sty | 2 +- .../cold-starts/result-visu.fsx | 21 ++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/doc/thesis/chapters/serverless.tex b/doc/thesis/chapters/serverless.tex index e6656ab..416e81c 100644 --- a/doc/thesis/chapters/serverless.tex +++ b/doc/thesis/chapters/serverless.tex @@ -285,6 +285,31 @@ \subsubsection{Übersetzungsvorgang} Wesentlich aufwändiger gestaltet sich die Interaktion mit der \textit{Web Jobs SDK}, bei Sprachen die nicht der .NET"=Familie angehören. Bei JavaScript Funktionen beispielsweise, ist eine Brücke zwischen der .NET \textit{Common Language Runtime} und der \textit{JavaScript}-Laufzeitumgebungen notwendig. Dieses Problem löst eine Bibliothek mit dem Namen \textit{Edge.js}. Damit ist es möglich, .NET und \textit{Node.js} Quellcode im selben Prozess auszuführen, indem beide Laufzeiten im selben Prozess geladen werden \cite{EdgeJs}. Das ist wesentlich effizienter, als beide Umgebungen getrennt auszuführen und über Interprozesskommunikation zu verbinden. +Die Programmiermodelle von .NET und \textit{Node.js} unterscheiden sich in manchen Punkten gravierend. In \textit{Node.js} wird Nebenläufigkeit beispielsweise durch Callback-basierte Programmierung gelöst, weil die virtuelle JavaScript-Maschine nur einen einzigen Ausführungsstrang nutzt. In .NET gibt es diese Einschränkung nicht. Hier wird Task-basierte Nebenläufigkeit bevorzugt. Programm \ref{prog:dotnet-javascript-bridge} zeigt aber, dass beide Konzepte isomorph sind und sich darum trotzdem gut verbinden lassen. + +\begin{program}[!hbt] +\caption{Brücke zwischen Task-basierter Programmierung in .NET und Callback-basierter Programmierung in JavaScript} +\label{prog:dotnet-javascript-bridge} +\noindent\begin{minipage}[t]{.48\textwidth} +\lstset{showlines=true} +\begin{GenericCode} +Func > + + +\end{GenericCode} % leave empty lines!!! + +\end{minipage}\hfill +\begin{minipage}[t]{.48\textwidth} +\lstset{showlines=true} +\begin{GenericCode} +function (/+\textcolor{red}{arguments}+/, /+\textcolor{cyan}{callback}+/) { + callback(/+\textcolor{cyan}{error}+/, /+\textcolor{olive}{result}+/); +} +\end{GenericCode} + +\end{minipage} +\end{program} + Die Kompilierung oder Interpretation der Job Funktion zur Laufzeit, ermöglicht ein sehr effizientes ausrollen dieser Funktionen. Es muss nicht die ganze Host-Anwendung neu übersetzt und Ausgerollt werden, wie es bei den in Abschnitt \ref{subsec:webjobssdk} beschriebenen traditionellen \textit{Web Jobs} der Fall war. \subsection{Azure Function App} diff --git a/doc/thesis/hgblistings.sty b/doc/thesis/hgblistings.sty index e3943ad..cfd10b8 100644 --- a/doc/thesis/hgblistings.sty +++ b/doc/thesis/hgblistings.sty @@ -111,7 +111,7 @@ keepspaces=true,% commentstyle={}, texcl=false, escapechar={}, - escapeinside={}, + escapeinside={/+}{+/}, #1}} {} diff --git a/src/azure-fun-tests/cold-starts/result-visu.fsx b/src/azure-fun-tests/cold-starts/result-visu.fsx index d45a48b..3b5858c 100644 --- a/src/azure-fun-tests/cold-starts/result-visu.fsx +++ b/src/azure-fun-tests/cold-starts/result-visu.fsx @@ -54,6 +54,8 @@ let cnnStr = let entries = downlaodTableToCsv cnnStr "coldStartTiming" "nix" +entries.Length + let avgPerRegion = entries |> List.groupBy (fun x -> x.Location) @@ -62,3 +64,22 @@ let avgPerRegion = key, Statistics.FiveNumberSummary samples ) +let dateStart = entries |> List.map (fun x -> x.Timestamp) |> List.min +let dateEnd = entries |> List.map (fun x -> x.Timestamp) |> List.max + +let dateRange = dateEnd - dateStart + +let latex = + avgPerRegion + |> List.map (fun (reg, stats) -> + reg, + stats + |> Seq.zip ["lower whisker"; "lower quartile"; "mediae"; "upper quartile"; "upper whisker"] + |> Seq.map (fun (name, value) -> sprintf "%s=%.2f" name value) + |> String.concat ", " + ) + +latex |> List.iter (printf "%A") + + +