<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Andrey Smirnov's Blog (go)</title><link>http://www.smira.ru/</link><description></description><language>en</language><lastBuildDate>Sun, 11 Jan 2015 19:24:29 GMT</lastBuildDate><generator>http://getnikola.com/</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Brainwashing про Go</title><link>http://www.smira.ru/en/posts/brw-go.html</link><dc:creator>Andrey</dc:creator><description>&lt;img alt="gopher" src="http://www.smira.ru/galleries/brw-go.png"&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: курс был отменен.&lt;/p&gt;
&lt;p&gt;17 и 18-го мая на платформе &lt;a class="reference external" href="http://brainwashing.pro/go/"&gt;Brainwashing&lt;/a&gt; мы
(я, &lt;a class="reference external" href="https://github.com/AlekSi/"&gt;Леша Палажченко&lt;/a&gt; и &lt;a class="reference external" href="https://github.com/kirs/"&gt;Кир Шатров&lt;/a&gt;)  собирались два дня вместе
c вами разбираться с Go и пробовать его на практике. Вначале я воспринял язык &lt;a class="reference external" href="http://golang.org/"&gt;Go&lt;/a&gt;
как "еще один модный язык", но, присмотревшись поближе, я полностью изменил свое мнение. Go для
меня заполнил нишу между Python и С. Я всегда любил Python, но мучался угрызениями совести: то, что я
написал, могло работать на C гораздо быстрее. С другой стороны, на C я бы подобное не написал за такое же
количество времени. Go оказался ровно посередине: с одной стороны, это небольшой язык программирования, спецификацию
которого можно прочитать за пару часов, а с другой стороны то, что я на нем напишу, работает быстро.&lt;/p&gt;
&lt;p&gt;Я никогда не любил Java за ее выдуманную сложность, я преподавал студентам C++ и чувствовал, что издеваюсь
над ними, когда мы разбираем связь &lt;tt class="docutils literal"&gt;private&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;protected&lt;/tt&gt;/&lt;tt class="docutils literal"&gt;public&lt;/tt&gt; с &lt;tt class="docutils literal"&gt;friend&lt;/tt&gt;, наследованием и перегрузкой.
Go тщательностью выбора минимального множества конструкций языка напомнил последнюю работу
&lt;a class="reference external" href="http://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%80%D1%82,_%D0%9D%D0%B8%D0%BA%D0%BB%D0%B0%D1%83%D1%81"&gt;Вирта&lt;/a&gt;, язык &lt;a class="reference external" href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D0%B5%D1%80%D0%BE%D0%BD_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)"&gt;Оберон&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Когда я начинал писать на Go, я думал, что буду одним из первопроходцев, мне придется написать самому
кучу библиотек, но я был удивлен, обнаружив огромное  количество качественных Go библиотек в самых разных областях.
Это уже похоже на питоновский "with batteries", то есть Go уже идет с батарейками в комплекте. Одним из хороших
примеров производительности Go является то, что он делит первое место с C и Java в
&lt;a class="reference external" href="http://www.techempower.com/benchmarks/"&gt;Web Performance Benchmark&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Вы хотите научиться писать на Go высокопроизводительные Web-сервисы? Тогда записывайтесь на
&lt;a class="reference external" href="http://brainwashing.pro/go/"&gt;Brainwashing про Go&lt;/a&gt;, а мы постараемся сделать так, что бы в эти два дня
вы получили максимум знаний и практических навыков. Приходите сами или записывайте всю команду разработки,
скучно не будет!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: курс был отменен.&lt;/p&gt;</description><guid>http://www.smira.ru/en/posts/brw-go.html</guid><pubDate>Wed, 12 Mar 2014 08:18:37 GMT</pubDate></item><item><title>aptly Memory Usage Optimization</title><link>http://www.smira.ru/en/posts/aptly-memory-usage-optimization.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;Next &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; version (0.4) would contain some changes to lower
memory requirements while doing general operations: memory usage will be decreased
by factor of 3. aptly is written in Go language, so this is a short story of optimizing Go
program memory usage.&lt;/p&gt;
&lt;p&gt;When I have been developing aptly, I suspected that memory usage would be not optimal, as
aptly is processing huge amounts of package metadata (for example, when mirroring upstream
Debian repositories consisting of 30000 packages). Memory usage went unnoticed until
I was testing aptly in virtual machine with just 512 MB of memory, aptly was performing poorly
because Linux was busy in swapping. This was something completely unexpected: so much memory?
how could that be?&lt;/p&gt;
&lt;p&gt;First I applied some general optimizations which were trivial:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;some long operations (like mirroring) were happening in single function and some big data structures
weren't required full time during function execution. So assigning &lt;tt class="docutils literal"&gt;nil&lt;/tt&gt; to them allowed Go's garbage
collector to reclaim unused memory faster.&lt;/li&gt;
&lt;li&gt;reusing buffers for structure encoding (this is safe, as there're no concurrent operations and resulting
byte slice is copied immediately).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of creating buffer every time...&lt;/p&gt;
&lt;pre class="code go literal-block"&gt;
&lt;span class="c1"&gt;// Encode does msgpack encoding of Package
&lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;

    &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MsgpackHandle&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;... re-use buffer:&lt;/p&gt;
&lt;pre class="code go literal-block"&gt;
&lt;span class="c1"&gt;// Internal buffer reused by all Package.Encode operations
&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;encodeBuf&lt;/span&gt; &lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Buffer&lt;/span&gt;

&lt;span class="c1"&gt;// Encode does msgpack encoding of Package, []byte should be copied, as buffer would
// be used for the next call to Encode
&lt;/span&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nx"&gt;encoder&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NewEncoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;codec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MsgpackHandle&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="nx"&gt;encoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;encodeBuf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Bytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Second, I had to find reliable way to measure memory consumption, that was easy thanks to &lt;a class="reference external" href="http://blog.cloudflare.com/recycling-memory-buffers-in-go"&gt;CloudFlare blog post&lt;/a&gt;. What I discovered first was:&lt;/p&gt;
&lt;img alt="mem stats for aptly snapshot verify" src="http://www.smira.ru/galleries/mem-verify0.png"&gt;
&lt;img alt="mem stats for aptly snapshot verify" src="http://www.smira.ru/galleries/mem-mirror-update1.png"&gt;
&lt;p&gt;&lt;a href="http://www.smira.ru/en/posts/aptly-memory-usage-optimization.html"&gt;Read more…&lt;/a&gt; (1 min remaining to read)&lt;/p&gt;</description><category>aptly</category><category>go</category><category>golang</category><category>memory</category><guid>http://www.smira.ru/en/posts/aptly-memory-usage-optimization.html</guid><pubDate>Wed, 05 Mar 2014 13:21:41 GMT</pubDate></item></channel></rss>