<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Блог Андрея Смирнова (go)</title><link>http://www.smira.ru/</link><description></description><language>ru</language><lastBuildDate>Sun, 11 Jan 2015 19:24:26 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/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><category>go</category><category>golang</category><category>обучение</category><guid>http://www.smira.ru/posts/brw-go.html</guid><pubDate>Wed, 12 Mar 2014 08:18:37 GMT</pubDate></item><item><title>Оптимизация использования памяти в aptly</title><link>http://www.smira.ru/posts/aptly-memory-usage-optimization.html</link><dc:creator>Andrey</dc:creator><description>&lt;p&gt;В следующей версии (0.4) &lt;a class="reference external" href="http://www.aptly.info"&gt;aptly&lt;/a&gt; использование памяти в самых частых
операциях сократится в три раза благодаря несложным оптимизациям. Т.к. aptly написана на Go,
это будет короткая история об оптимизации использования памяти программами на Go.&lt;/p&gt;
&lt;p&gt;Когда я начинал разрабатывать aptly, я подозревал, что использование памяти будет далеко не
оптимальным, т.к. aptly "переваривает" большое количество метаданных пакетов (например, зеркало
Debian репозитория может содержать информацию о 30 тыс. пакетов). Я не замечал, что aptly использует
много памяти до того, как не начал тестировать на виртуалке с 512 Мб памяти. aptly работала крайне
медленно из-за постоянного свопирования. Я такого никак не ожидал: почему используется столько памяти?&lt;/p&gt;
&lt;p&gt;Для начала я применил тривиальные оптимизации:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;некоторые долгие операции (например, зеркалирование репозитория), происходят в рамках выполнения одной функции,
и некоторые структуры данных становятся ненужными до окончания работы функции. Так, обнуляя (присваивая &lt;tt class="docutils literal"&gt;nil&lt;/tt&gt;) переменные,
можено дать возможноть garbage collectorу освободить ненужную память до окончания выполнения функции.&lt;/li&gt;
&lt;li&gt;повторное использование буферов для сериализации структур (это безопасно, т.к. нет конкурентного доступа, а результат
сериализации немедленно копируется).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Вместо того, чтобы создавать буфер каждый раз...&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;... можно использовать его повторно:&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;Во-вторых, необходимо начать измерять то, что мы пытаемся оптимизировать: использование памяти. С помощью &lt;a class="reference external" href="http://blog.cloudflare.com/recycling-memory-buffers-in-go"&gt;поста в блоге CloudFlare&lt;/a&gt; это сделать совсем несложно. Вот что я обнаружил:&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/posts/aptly-memory-usage-optimization.html"&gt;Читать далее…&lt;/a&gt; (1 минут чтения осталось)&lt;/p&gt;</description><category>aptly</category><category>go</category><category>golang</category><category>программирование</category><guid>http://www.smira.ru/posts/aptly-memory-usage-optimization.html</guid><pubDate>Wed, 05 Mar 2014 13:21:41 GMT</pubDate></item></channel></rss>