104 lines
6.8 KiB
Plaintext
104 lines
6.8 KiB
Plaintext
<!DOCTYPE html>
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="generator" content="pandoc" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
|
<meta name="author" content="By John Mercouris" />
|
|
<title>Another week, another version</title>
|
|
<style type="text/css">
|
|
code{white-space: pre-wrap;}
|
|
span.smallcaps{font-variant: small-caps;}
|
|
span.underline{text-decoration: underline;}
|
|
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
|
</style>
|
|
<style type="text/css">
|
|
a.sourceLine { display: inline-block; line-height: 1.25; }
|
|
a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
|
|
a.sourceLine:empty { height: 1.2em; position: absolute; }
|
|
.sourceCode { overflow: visible; }
|
|
code.sourceCode { white-space: pre; position: relative; }
|
|
div.sourceCode { margin: 1em 0; }
|
|
pre.sourceCode { margin: 0; }
|
|
@media screen {
|
|
div.sourceCode { overflow: auto; }
|
|
}
|
|
@media print {
|
|
code.sourceCode { white-space: pre-wrap; }
|
|
a.sourceLine { text-indent: -1em; padding-left: 1em; }
|
|
}
|
|
pre.numberSource a.sourceLine
|
|
{ position: relative; }
|
|
pre.numberSource a.sourceLine:empty
|
|
{ position: absolute; }
|
|
pre.numberSource a.sourceLine::before
|
|
{ content: attr(data-line-number);
|
|
position: absolute; left: -5em; text-align: right; vertical-align: baseline;
|
|
border: none; pointer-events: all;
|
|
-webkit-touch-callout: none; -webkit-user-select: none;
|
|
-khtml-user-select: none; -moz-user-select: none;
|
|
-ms-user-select: none; user-select: none;
|
|
padding: 0 4px; width: 4em;
|
|
color: #aaaaaa;
|
|
}
|
|
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
|
|
div.sourceCode
|
|
{ }
|
|
@media screen {
|
|
a.sourceLine::before { text-decoration: underline; }
|
|
}
|
|
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
|
|
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
|
|
code span.at { color: #7d9029; } /* Attribute */
|
|
code span.bn { color: #40a070; } /* BaseN */
|
|
code span.bu { } /* BuiltIn */
|
|
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
|
|
code span.ch { color: #4070a0; } /* Char */
|
|
code span.cn { color: #880000; } /* Constant */
|
|
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
|
|
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
|
|
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
|
|
code span.dt { color: #902000; } /* DataType */
|
|
code span.dv { color: #40a070; } /* DecVal */
|
|
code span.er { color: #ff0000; font-weight: bold; } /* Error */
|
|
code span.ex { } /* Extension */
|
|
code span.fl { color: #40a070; } /* Float */
|
|
code span.fu { color: #06287e; } /* Function */
|
|
code span.im { } /* Import */
|
|
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
|
|
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
|
|
code span.op { color: #666666; } /* Operator */
|
|
code span.ot { color: #007020; } /* Other */
|
|
code span.pp { color: #bc7a00; } /* Preprocessor */
|
|
code span.sc { color: #4070a0; } /* SpecialChar */
|
|
code span.ss { color: #bb6688; } /* SpecialString */
|
|
code span.st { color: #4070a0; } /* String */
|
|
code span.va { color: #19177c; } /* Variable */
|
|
code span.vs { color: #4070a0; } /* VerbatimString */
|
|
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
|
|
</style>
|
|
<!--[if lt IE 9]>
|
|
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
|
<![endif]-->
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1 class="title">Another week, another version</h1>
|
|
<p class="author">By John Mercouris</p>
|
|
</header>
|
|
<p>Hello and welcome to another week of Atlas!</p>
|
|
<p>This week, development moves on to 3.0.0. Our goals for 3.0.0 are increased performance, refactoring for simplicity, and more features! In the following update we'll talk a little bit about how we're improving Nyxt's performance.</p>
|
|
<h1 id="background">Background</h1>
|
|
<p>Modern desktop computers are increasing their computational throughput via the introduction of more processors, more threads, and more parallelization. In order to take advantage of this, we've begun utilizing <code>lparallel</code> wherever applicable. Specifically, <code>lparallel</code> cognates.</p>
|
|
<h1 id="what-are-lparallel-cognates">What are Lparallel Cognates?</h1>
|
|
<p>For those unfamiliar, <code>lparallel</code> cognates are <code>lparallel</code> versions of Common Lisp functions which are… <em>parallelized</em>. If that didn't make sense, here is a simplified example:</p>
|
|
<div class="sourceCode" id="add one to all" data-org-language="lisp"><pre class="sourceCode commonlisp"><code class="sourceCode commonlisp"><a class="sourceLine" id="add one to all-1" data-line-number="1">(<span class="kw">mapcar</span> (<span class="kw">lambda</span> (i) (<span class="op">+</span> <span class="dv">1</span> i)) (<span class="kw">list</span> <span class="dv">0</span> <span class="dv">1</span> <span class="dv">2</span> <span class="dv">3</span>))</a></code></pre></div>
|
|
<p>The above function will iterate through every single element in the list <code>(list 0 1 2 3)</code> and add 1. It will do this sequentially. You can imagine that the amount of time it takes for the above <code>mapcar</code> to complete is directly tied to the amount of elements it must process.</p>
|
|
<p>If we make a minor change and write:</p>
|
|
<div class="sourceCode" id="add one to all, parallelized" data-org-language="lisp"><pre class="sourceCode commonlisp"><code class="sourceCode commonlisp"><a class="sourceLine" id="add one to all, parallelized-1" data-line-number="1">(lparallel:pmapcar (<span class="kw">lambda</span> (i) (<span class="op">+</span> <span class="dv">1</span> i)) (<span class="kw">list</span> <span class="dv">0</span> <span class="dv">1</span> <span class="dv">2</span> <span class="dv">3</span>))</a></code></pre></div>
|
|
<p>Now, <code>lparallel</code> will process the elements in parallel. That is, if you have four processor cores, each core will add 1 to each element in the list. Theoretically, you could complete this operation in 1/4 of the original time. In practice, the performance gain is less due to thread management overhead. The difference is however still significant. On some operations we noticed that the processing time was more than halved!</p>
|
|
<p>The above approach works because operations like <code>mapcar</code> are functional. They map an operation over a list, a natural candidate for parallelization. They can easily take advantage of the many processor cores modern machines have.</p>
|
|
<p>This parallelization has resulted in a snappy <code>prompt-buffer</code>. We hope you enjoyed a little sneak peek into what we're working on. Thanks for reading, and have a nice week :-)</p>
|
|
</body>
|
|
</html>
|