Ответы пользователя по тегу C++
  • Почему простой цикл на c++ выполняется медленнее, чем на golang?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Судя по скриншоту это windows. Если вы делаете бенчмарки под windows - то нужно правильно мерять время. Скорее всего вы меряли не время цикла а время запуска windows процесса + время цикла. Вместе с статическими конструкторами. И эти конструкторы в go оказались удачнее.

    Короче вы не втом месте включали секундомер. А то так можно и доказать что PHP быстрее чем C++.
    Ответ написан
    2 комментария
  • Как написать приложение на c++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Данный вопрос выходит за рамки C++.

    Он касается разработки под конкретную ОС (windows например) и эти вопросы нужно адресовать их API.
    Ответ написан
    1 комментарий
  • Как задать значение последней переменной?

    mayton2019
    @mayton2019
    Bigdata Engineer
    int64_t a = b/0
    Ответ написан
    Комментировать
  • Как конвертировать указатель PWSTR в указатель на string (c++)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Тут проблема наверное в том что PWSTR - имеет фиксированную разрядность (это широкий символ w_char). А std::string зависит от опций препроцессора UNICODE. Так-то оно конструируется через конструктор string или присвоение.
    Ответ написан
    2 комментария
  • Почему при вычитании двух вещественных результат неправильный?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вещественные бывают float и double. И у них - разная точность при работе с десятичной системой.
    Вообще все они не точно отражают введенную тобой десятичную дробь. Вопрос в том что ты с этого хочешь
    получить?

    Вот есть онлайн-калькулятор https://www.h-schmidt.net/FloatConverter/IEEE754.html
    Понабирай в нем твои числа и понаблюдай во что они превращаются после присвоения. А тогда уже
    и вопросы по вычитаню отпадут.
    Ответ написан
    21 комментарий
  • Как можно ускорить алгоритм?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какое-то время я посвятил играм с простыми числами. В студенчестве еще.
    Вот тут не надо каждый раз прибавлять единичку.
    if (K % (i + 1) == 0) {
    Ее просто надо учесть в условиях цикла.
    if (K % i == 0) {
    Далее. Если нужно найти первый попавшийся делитель - то не надо перебирать все числа. Достаточно только 2 и все нечетные. Или даже лучше задать хард-кодом таблицу простых чисел до 2^16. Это как раз будет половина разрядной сетки int32.
    int primes[] = { 2,3,5,7,11,13,17...... 65521 }
    Это даст хорошее ускорение для поиска. Хотя время загрузки executable может увеличится. Кстати у меня много вопросов к бенчмаркам где стоит запредельно короткое время инициализации (0.25 s). Здесь - практически невозможно вычленить где время занимает алгоритм а где - просто запуск процесса операционки. Обычно когда меряют что-то подобное - меряют длительные процессы хотя-бы порядка минут но никак не секунд.
    Ответ написан
    2 комментария
  • Что не так, в чем ошибка?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В С++ массивы нумеруются от нуля до (n - 1).
    Ответ написан
    6 комментариев
  • Почему используется потенциально неинициализированная локальная переменная-указатель "matrix"?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если у вас d не равно 1 тогда возникает flow который приводит к matrix которая не аллоцирована.

    Кстати вы используете не матрицу а так называемый Jagged Array (зубастый массив). В этом нет смысла т.к. у вас матрица всегда прямоугольная и рациональнее выделить один большой массив и распределять его ячейки как элементы прямоугольной матрицы (i,j) формула смещения - очень простая. Ширину умножить на один индекс плюс второй.

    Я-бы делал так

    float* matrix = new float[n * m]
    ну и формулы доступа дальше подправить надо соотвественоо.
    Ответ написан
    Комментировать
  • Как повысить точность вещественного деления в среде C++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нормально все считается. У меня вышло

    sizeof(double) = 8 bytes
    z = 16.66666666666666785090


    gcc version 9.4.0
    Ответ написан
    2 комментария
  • Как на Linux читать и изменять память процесса?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Чтобы просто почитать память процесса - ему можно послать сигнал SIGQUIT и он должен ссыпать самого себя в дамп файла. Это законный метод. Программист пытается понять state процесса.

    Все прочие методы должны вызывать настоящий ужас спецов по инфо-безопасности. Кому понадобилось изменять чужие процессы? Какой юзкейс?
    Ответ написан
    Комментировать
  • Как правильно передавать функцию в качестве параметра?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если компиллятор глотает оба варианта и тесты проходят - то я-бы взял просто первый вариант.

    Там меньше букв.
    Ответ написан
    3 комментария
  • Какой open source проект написан на труъ Си++?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Полностью согласен с необоснованностью претензий. Те кто делали код-ревью и отметили что код слишком сишный должны писать конкретные code-review points и аргументировать почему здесь надо затащить классы и ООП. Есть масса продуктов (git) написанных на С и ни у кого не возникает вопросов из серии почему мало ООП. Сколько надо ООП на квадратный метр? Килограмм?

    Нет смысла также кидаться в гитхаб и искать там правильные TrueЪ примеры. Там тоже не боги горшки обжигают. Кроме того С++ - это не только ООП, это мультипарадигменный язык. Тоесть там будут где надо виртуальные вызовы а где надо лямбды или процессор шаблонов и только богу известно почему автор решил здесь так или эдак.
    Ответ написан
  • Как замерить производительность i/o?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Замер i/o это хитрая штука. Тут недостаточно просто программирования. Нужно знать что ОС обычно берет на себя часть функций по управлению (планировщики) вводом-выводом и кеширование.

    Тоесть если ты будешь тестить свои программы в порядке 1->2 то вторая будет иметь фору в виде прогретого дискового кеша. И нужно делать хотябы -4-6 экспериментов чередуя 1->2->1->2 несколько раз и собирать кумулятивное время для каждого приложения и потом брать арифметическое среднее.

    Данный класс Timer в таком виде не нужен. Он слишком прост и его можно заменить в коносли на вызов

    $ time yourapplication

    В качестве улучшений таймера я-бы сделал StopWatch. Это таймер который можно вызывать несколько раз и он будет кумулятивно считать время между begin-end и выводить его в конце. Так можно мерять интересующие фрагменты кода которые работают только с диском и игнорировать например вычисления с CPU.
    Ответ написан
    Комментировать
  • Как сгенеририовать СЛАУ (система линейных алгебраических уравнений) больших размеров?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для хранения матрицы 10000 на 10000 в формате double вам понадобиться кусок памяти порядка 800 Мб.
    И это только для хранения исходных данных. А если нужно будет искать всякие определители и обратные матрицы
    то сложно себе представить сколько дополнительной памяти будет нужно.

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

    Чем заполнить матрицы в данном примере - ХЗ. Надо погружаться в сам курсовой. Если он растет из физики то и исходные данные надо брать оттуда. Там всякие диагональные и треугольные и прочие.
    Ответ написан
    Комментировать
  • Как написать алгоритм пересечения графиков двух функций с определенным уровнем допуска?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если функция непрерывна и если задана таблично. То можно проинтерполировать значения на интервалах между точками хотя бы по любой гладкой кривой типа полинома. И тогда окажется что несмотря на то что дискретные точки недостаточно близко находились друг к другу, а интерполированные отрезки сблизились к некому "эпсилон".

    Тоесть в условии задачи скорее всего не хватает деталей.
    Ответ написан
  • Как найти точки внутри фигуры, за пределами фигуры и на фигуре?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Все подобные задачи решаются через расчет ориентации точки на плоскости относительно вектора (в данном случае это сторона ромба). Знак векторного произведения даёт нам ориентации. И дальше - дело техники. Проверить все стороны и доказать что точка - по одну сторону ( знак плюс или минус - зависит от базиса и системы координат ). Его проще вычислить экспериментально за 2 проверки.
    Ответ написан
    Комментировать
  • Как шифровать заголовки/атрибуты файлов С++ в MFT?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Шифрование заголовков и MFT это слабая защита или даже вообще не защита. Софт который восстанавливает поверхность диска - умеет распознавать и реконструировать блоки файлов как паззл если файлы имеют известный формат и статистические свойства
    Ответ написан
    Комментировать
  • Как организовать передачу данных с сетевого интерфейса приложению на C++ максимально быстро?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вопрос поставлен неправильно.
    Чтоб оптимизировать odbc - надо 100% знать что именно он является узким местом. Я бы начал с анализа исполнения и извлечения данных локально на сервере. ДБА здесь поможет. И если ваша задаче связана с ETL - почитайте про техники. Может экспорт в csv файл с загрузкой в с++ приложение будет быстрее. Может репликация бд или миграция.
    Ответ написан
    Комментировать
  • Скорость чистого перебора - как такое может быть?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Принты. Или наблюдения.
    1. Цикл где идет merge двух векторов - тривиален. Слабым местом может быть функция резерва памяти, которая по разному реализована в win/Linux. Я не утверждаю что в linux она плохая. Возможно просто звёзды сошлись так что page или другие свойства ос по отношению к аллокаций стали неблагоприятны.

    2. Что там с разрядностью 32/64? Надо проверить. Что с железом? Не пытается ли автор нас обхитрить, запуская все это на разном железе. Даже ничтожные различия в размере кешей L1 могли тут сработать.

    3. Версии STL. Автор использует не сырые указатели а итераторы. Причем хитрые. Какая там логика на инкремент и на разыменование под капотом.

    Чтоб отбросить мои предположения полностью - предлагаю этот цикл (предположительно самый горячий код со слов автора) переписать на указатели без STL.

    4. Опции GCC надо посмотреть. Оптимизацию подвигать. O1, O2.
    Ответ написан
    1 комментарий