Архив метки: программирование

Почему мне перестал нравиться Qt

Когда-то давным давно я полюбил Qt. Он был простой, с качественной документацией, наличием своей среды разработки. В нем были свои контейнеры QHash, QMap, QVector и после них, глядя на std, становилось сильно плохо.

Все изменилось в 2013-ом году, когда компиляторы gcc и clang начали полноценно поддерживать C++11. Этот факт прошел мимо меня, что и неудивительно. Все важные события нужно отслеживать самому.

Для понимания всей картины рекомендую посмотреть доклад от разработчика Qt: https://youtu.be/uZ68dX1-sVc?t=29m20s
Читать далее

Пущинская новогодняя олимпиада 2018

Месяц назад мы провели очередную Пущинскую новогоднюю олимпиаду.

В этот раз мы были особо амбициозны, и ровно по этой причине мы получили кучу проблем. Задачи писало аж пять человек — я с Арсением, Леша Соловьев, Данила Сорокин и Татьяна Ивановна. Кроме того, Женя Баулин тусовался в нашем google doc, где он помогал исправлять грамматические и логические ошибки.

Сам google doc с задачами был создан более чем за 2 месяца до олимпиады, но задач в нем не было. Обычно мы с Арсением начинали с пары задач, потом кое-как состыковывались друг с другом, получали сюжет, определяли необходимую сложность и количество задач.

Не в этот раз.

Читать далее

Сборка BSA-Analytics под Windows 10

Недавно выдалось свободное время, начал разбираться с частью проблем в BSA-Analytics. На основной рабочей машине перестал работать функционал подгрузки и обработки длинных данных. Исходные данные:

  1. 2 года назад все стабильно работало
  2. Под линуксом все и сейчас стабильно работает
  3. Под виртуалкой и под линуксом все работает
  4. Под чужой Windows 7 все работает
  5. Версия полугодовалой давности везде работает
  6. Никаких изменений за последние полгода, которые могли бы сказаться, не было. Тем не менее, все сломалось
  7. На рабочем компе Windows 8.1, которая затеяла массивное обновление самой себя некоторое время назад

Читать далее

Сага о скорости sscanf

В нашем проекте есть одно из мест при чтении, когда надо распарсить строчку с числами вида «{ 123, 234, 345, 456, 567 }». Там всегда стоял сишный код декодирования через scanf. Ну а потом там пришлось все переделывать, и я на автомате написал декодирование в Qt стиле. А потом решил проверить что же будет быстрее.

Итого, у нас 2 варианта:
1) Ищем каждую первую цифру из каждого из чисел, после чего натравливаем scanf()
2) Сплитим строчку по разделителю, после чего для каждой полученной строки исполняем QString().toInt()

Для проверки что же работает быстрее я написал следующий код:

#include <QCoreApplication>
#include <QtGlobal>

#include <QElapsedTimer>
#include <QString>
#include <QStringList>
#include <QDebug>

#include <stdio.h>

int main(int argc, char *argv[])
{
    QByteArray r;
    for (int i = 0; i < 1000000; i++) {
        float a;
        int b = rand();
        a = *reinterpret_cast<float*>(&b);
        r += QString::number(rand()).toUtf8() + '\0';
    }

    //------------------------------------------
    //------------------------------------------

    QElapsedTimer timer;
    timer.start();

    QList<QByteArray> l = r.split('\0');
    float res = 0;
    for (int i = 0; i < l.size(); i++) {
        res += l.at(i).toFloat();
    }

    qDebug() << res << timer.elapsed();

    //------------------------------------------

    timer.start();

    const char *data = r.data();
    int size = r.size() - 1;
    res = 0;
    float f;
    for (int i = 0; i < size; i++)
        if (data[i] == '\0') {
            sscanf(data + i + 1, "%f", &f);
            res += f;
        }

    qDebug() << res << timer.elapsed();

    return 0;
}

Дебаг сборка
Qt: 165мс на декодирование
Си: 171мс на декодирование

Релиз сборка
Qt: 144мс
Си: 153мс

Массив чисел можно генерить как из целых, так и из float — скорость от этого особо не изменится. Зато скорость знатно меняется, если в качестве разделителя использовать не \0, а, допустим, просто пробел.

В таком случае, если уменьшить количество чисел с 1000000 до 100000, скорости будут такими (релиз):
Qt: 18мс
Си: 963мс

Знаете что это значит? Это значит, что если втупую написать код на Си, ожидая что он будет работать быстрее, то он не только может оказаться медленнее, он может совершенно случайно начать работать за квадрат вместо линии, которую обеспечивает Qt. Остается только догадываться насколько эффективно можно использовать еще более быстрый инструмент — ассемблер.

Ни дня без коммитов

Мой github

Прожил 73 дня, ежедневно модифицируя BSA-Analytics. Первые пару недель непрерывность была случайной, потом она стала искусственной. По внутренним правилам нельзя было переводить часы, заводить фиктивные задачи и отправлять коммиты с пробелами. Стрик был прерван случайно, я в тот день физически возился с сервером и просто забыл про отсутствие коммитов.

Положительные эффекты:

  • Проект не выгружается из памяти, в любой момент я все помню и могу что-нибудь реализовать
  • Абсолютно все мелочи, типа умения программы выдавать свою версию, реализуются, потому что надо что-то писать. Что-то простое, но не особо нужное, зачастую написать проще, чем что-то сложное. А программа состоит из мелочей
  • В целом, по крайней мере первые пару недель, получается хороший буст по скорости и настроению

Отрицательные эффекты:

  • Размывается граница между отдыхом и работой. Иногда все же требуется на пару дней забыть о проекте
  • Постоянно приходится помнить о проекте. Иногда это весело, один раз я вспомнил об отсутствии коммитов в 23:56, и вполне успел реализовать конкретную фичу, но большей частью это просто неудобно
  • Начинается некоторое растягивание задач по времени. Например сначала открывается задача в багтрекере, а на следующий день закрывается. Еще получается удобно кодить около 11 вечера. Тогда можно сделать коммиты сразу за 2 дня
  • Не учитывается физический вклад. Конечно можно открывать и закрывать задачи вида «Сходить поставить программу на счет», но этому не место в моем уютном багтрекере

Забавные моменты:

  • Один раз пришлось все делать на экстрим-скорости: я вспомнил о BSA-Analytics в 23:56. К счастью, я весь день крутил в голове что и как надо сделать, поэтому успел за 15 секунд до полуночи
  • Три недели назад я остался без клавиатуры на ноуте, поэтому пяток коммитов был полностью сделан с помощью экранной клавиатуры
  • Один из коммитов пришлось по техническим причинам делать по дороге в Москву с экранной клавиатуры и мобильного интернета

Пущинская Новогодняя 2016

В это воскресенье провели очередную олимпиаду, как обычно, без проблем не обошлось. Вечером пятницы выяснилось, что по Пущино объявлен карантин, школы закрыты. Площадки проведения нету. Как основной вариант рассматривался институт + ноутбуки из гимназии. Вот только ноутбуки получить не удалось, а в институте своих машин не было. Неожиданной фигурой выступила наш хорошо знакомый городской депутат — Ира Селезнева. Благодаря разведенной бурной деятельности вышеупомянутой была задействована вся вертикаль власти в Пущино, и мы смогли провести олимпиаду в третьей школе.
Читать далее

МГУ, ВМК, medialab, видеогруппа

Ровно год назад, 26 марта, я сидел в пустом кабинете и решал простую задачу. Надо было компенсировать два кадра, был дан шаблон под visual studio. Не работал поиск блоков 8×8.

Читать далее

Веселая школьная олимпиада 2013

К сожалению, в те времена я еще не вел блог, это единственная причина, по который не написал об этом ранее. Какая это была олимпиада я, честно говоря, уже забыл (их много). Но по количеству участников и модели своего ноута я все восстановил.

Читать далее