• Chromium — это не только браузер, но и хороший фреймворк



      Большинство людей привыкли, что Chromium — это и браузер, и основа для других браузеров. До недавнего времени я тоже так думал, но, изучая эту тему уже пару месяцев, я начал открывать другой дивный мир. Chromium — это огромная экосистема, в которой есть всё: и система зависимостей, и система кроссплатформенной сборки, и компоненты почти на все случаи жизни. Так почему же не попробовать создавать свои приложения, используя всю эту мощь?

      Под катом небольшое руководство, как начать это делать.
      Читать дальше →
    • Ускоряем неускоряемое или знакомимся с SIMD, часть 2 — AVX

        Предыдущая часть вызвала бурную дискуссию, в ходе которой выяснилось, что AVX/AVX2 на самом деле есть в десктопных CPU, нет только AVX512. Поэтому продолжаем знакомиться с SIMD, но уже с современной его частью — AVX. А так же разберём некоторые комментарии:


        • медленнее ли _mm256_load_si256, чем прямое обращение к памяти?
        • влияет ли на скорость использование AVX команд над SSE регистрами?
        • действительно ли так плохо использовать _popcnt?
        Читать дальше →
      • Ускоряем неускоряемое или знакомимся с SIMD

          Есть класс задач, которые нельзя ускорить за счёт оптимизации алгоритмов, а ускорить надо. В этой практически тупиковой ситуации к нам на помощь приходят разработчики процессоров, которые сделали команды, позволяющие выполнять операции на большим количеством данных за одну операцию. В случае x86 процессоров это инструкции сделанные в расширениях MMX, SSE, SSE2, SSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, AVX512.

          В качестве «подопытного кролика» я взял следующую задачу:
          Есть неупорядоченный массив arr с числами типа uint16_t. Необходимо найти количество вхождений числа v в массив arr.
          Классическое решение, работающее за линейное время выглядит так:

          int64_t cnt = 0;
          for (int i = 0; i < ARR_SIZE; ++i)
              if (arr[i] == v)
                  ++cnt;
          

          В таком виде бенчмарк показывает следующие результаты:

          ------------------------------------------------------------
          Benchmark                     Time           CPU Iterations
          ------------------------------------------------------------
          BM_Count                   2084 ns       2084 ns     333079
          

          Под катом я покажу как его ускорить в 5+ раз.
          Читать дальше →
        • Необязательные аргументы в функциях Go

            В Go нет синтаксиса для определения необязательных аргументов в функциях, поэтому приходится использовать обходные пути. Я знаю 2:

            1. Передавать структуру, содержащую все необязательные аргументы в полях:

              funcStructOpts(Opts{p1: 1, p2: 2, p8: 8, p9: 9, p10: 10})
            2. Способ предложенный Робом Пайком с использованием функциональных аргументов:

              funcWithOpts(WithP1(1), WithP2(2), WithP8(8), WithP9(9), WithP10(10))

            Второй способ в принципе делает тоже самое, но с синтаксическим сахаром. Мне не давала покоя мысль, а сколько же стоит этот сахар, кому ещё интересно прошу под кат.
            Читать дальше →
          • Мои 5 копеек про Highload Cup 2017 или история 9го места

              Про Higload Cup уже было несколько статей, поэтому о том, что это было писать не буду, кто пропустил можете почитать в «История 13 места на Highload Cup 2017».

              Так же постараюсь не повторяться и поделюсь интересными, с моей точки зрения, решениями. Под катом:

              1. Немного про структуру данных
              2. Парсинг JSON'а на define'ах
              3. URI unescape
              4. UTF decode
              5. HTTP Server
              6. Тюнинг сети

              и много кода.
              Читать дальше →