Задать вопрос
  • Как обойти ограничение/шейпинг скорости до 1 Мб/с МТС?

    @Drno
    Стоит купить симку для модема с нормальным тарифом
    У мтс нет безлимитных тарифов
    Ответ написан
    Комментировать
  • Что быстрее индексы или указатели?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Зависит от модели процессора, версии и опций компилятора и немножечко фазы луны. В целом без разницы.

    Практический совет - лучше писать через индексы, ибо так понятнее и больше шансов что компилятор там все наоптимизирует (например, он сможет векторизовать работу через какие-нибудь SSE инструкции процессора).

    Совет по бенчмарку - если памяти не хватает, стоит по одному достаточно большому массиву пройтись 10000 раз. А лучше использовать готовые фреймворки для измерения скорости, вроде того де gbenchmark.

    Еще, иногда полезно посмотреть на ассемблерный выхлоп. Вот, например, что происходит при -O3 опции компилятора. Он генерирует вообще идентичный код для обеих функций (развернув циклы)! И даже при -O2 оно одинаковый код выдает.

    Без оптимизаций код разный, но там все не так как вы думаете. Вместо инструкции mov eax, dword ptr [rax + 4*rcx] в варианте с индексами используется инструкция mov eax, dword ptr [rax] для указателей. Это самое "складывание с указателем массива" вообще не отдельная операция - а вариант адрессации в инструкции mov. Они могут вообще одинаковое количество тактов занимать, это надо мануал по конкретной архитектуре процессоров читать.
    Ответ написан
    Комментировать
  • С какой ветки обновляет git pull?

    С какой ветки обновляет git pull?

    С той удаленной ветки, которой соответствует ваша текущая локальная ветка

    Когда в своей ветке я нажимаю git pull, то каким образом происходит обновление моей ветке?

    Гит смотри на удаленную ветку и, если там есть изменения, подтягивает их

    Например я создал текстовый файл в master и хочу, чтобы он появился в моей ветке, как это сделать?

    Слить мастер в вашу текущую ветку

    git pull не добавляет его?

    Если вы находитесь в другой ветке, отличной от мастера, то нет - не добавляет
    Ответ написан
    Комментировать
  • Объясните пожалуйста как работает пинг?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Добавлю к вышесказанному.

    Пинг меряет вовсе не время передачи между исходным и конечным узлами. Показываемое время в основном уходит на обработку пинга как промежуточными узлами (после приёма надо решить, куда отправлять, а это время), так и конечным узлом (получив пинг, надо сформировать и отправить понг). А если какой-то из этих узлов сильно загружен, то и пинг получится немаленьким (но больше всего может отличиться конечный узел - ответ на пинги имеет крайне низкий приоритет, и узел будет формировать ответ в самую последнюю очередь, лишь переделав всё остальное).

    Так что маршрут в 20 хопов имеет более высокий шанс показать большее время пинга по сравнению с маршрутом в 10 хопов, даже если он физически и короче.
    Ответ написан
    Комментировать
  • В какого типа переменных хранить адреса?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Для подобных целей уже давно заведены intptr_t и uintptr_t [?], а еще ptrdiff_t [?].
    Именно эти типы и стоит использовать для прямой работы с адресами.

    Теги C и C++ смешивать не совсем уместно. Это мешает выбору более подходящего варианта ответа.
    В C++, например, если нужно только хранить адрес и позволять с ним только определенные операции, лучше мог бы подойти enum class MemoryAddress : uintptr_t;. Пустое перечисление с достаточной шириной и выравниванием избавит от возможности случайно что-то куда-то прибавить или умножить, да и от неявных преобразований убережет. А перегрузка операторов поможет разрешить только определенные операции.
    Но в C так не получится.
    Ответ написан
    Комментировать
  • Context switch per second (Linux) 1.3млн это много или мало?

    @asmelnik Автор вопроса
    Спасибо всем неравнодушным и ответившим по существу проблемы.
    Всякое решение плодит новые проблемы.(один из законов Мэрфологии)

    Похоже время ответить на вопрос и закрыть тему

    Context switch per second (Linux) 1.3млн это много или мало?
    Если коротко — это для конфигурации
    E5-2699v4 — 2шт
    RAM 378Gb
    Довольно много, но не предел.
    Достигнутый максимум 1.5 млн.
    Достигнут был при следующих условиях:
    Совет от edo1h,
    1. mitigations=off, это снизит стоимость переключения контекста;
    2. «Зажал» бы частоту процессора и отключил всякие c3, энергосберегающие опции плохо совместимы с короткими запросами.
    processor.max_cstate=1 intel_idle.max_cstate=1 к параметрам ядра, плюс поставить pstate-frequency и запустить pstate-frequency -p max (если помогло, то в systemd включаем pstate-frequency@max)

    Дал направление копания, итоговый набор параметров ядра совпал с советом выше.
    mitigations=off intel_idle.max_cstate=1 processor.max_cstate=1

    Замечания jcmvbkbc, res2001, Everything_is_bad натолкнули на мысль разделить задачи сервера на более-менее автономные блоки и исследовать как по отдельности, так и взаимосвязи между ними.

    Результат оказался для меня неожиданным (об этом в п.3)

    1. Сеть
    Тюнинг сетевой подсистемы дал снижение количества прерываний/сек (не слишком значительное, но это положительным образом сказалось на результатах).
    Убрал bonding интерфейсов (выигрыш на уровне погрешностей измерения, но иногда(хоть и крайне редко) при работающем bonding наблюдались всплески interrupts, которые полностью отсутствовали при выключенном bonding в течении 4-х дней)
    Максимальный размер буферов на адаптере.
    Воспользовался tuned + корректировка параметров sysctl.
    Профиль network-latency субъективно подошел лучше всего.

    2. Работа nginx-а
    Тут дало положительный эффект запуск 2-х независимых серверов на 2-х dummy интерфейсах. Не могу пока предположить с чем связано.

    3. Неожиданный эффект — т.к. логирование таки необходимо, довольно много сливалось в rsyslog по unix.socket (сеть не вариант, нагрузка выше заметно)
    Вот отказ от заливки логов nginx-а в rsyslog снял 75-76% (С 1.3млн до 0.3млн на пиках нагрузки) количества «Context switch per second».
    Буквально «на коленке» на python написал заменитель, вся задача — сообщение из unix.socket записать в файл в нужном формате.

    Итог, сервер выполняет те же функций:
    «Context switch per second» -- снизился на 50% от исходного.
    Нагрузка на CPU — снижение примерно на 25-30%.
    При тех нагрузках, при которых ранее появлялись отказы, отказов нет.
    Ответ написан
    4 комментария
  • Возможно ли выпустить проприетарный DKMS-модуль для ядра Linux по лицензии GNU GPL v2?

    ValdikSS
    @ValdikSS
    Модули ядра не обязаны лицензироваться под GPL.
    Возможно ли создать проприетарный dkms-модуль для ядра Linux с полностью закрытым исходным кодом не нарушая свободную лицензию?
    Да, возможно. Существует большое множество проприетарных модулей, или просто модулей под другими свободными лицензиями. Например, ZFS for Linux.
    Ответ написан
    5 комментариев
  • Что делать, если программа не видит библиотеку iostream?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    Понять, что C и C++ - это два разных языка, и либо использовать C++, либо не использовать iostream.
    Ответ написан
    Комментировать
  • Что не так с Futex?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему такая ошибка со своим mutex

    потому что pthread_t шире чем int owner, и как следствие этот тест не работает.
    Ответ написан
  • Как можно улучшить код?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как можно улучшить код?

    - отформатировать по какому-нибудь стандарту, чтобы хотя бы строчки не гуляли влево-вправо.
    - пользоваться тернарным оператором вместо if когда это имеет смысл. На мой взгляд, d = n < 0 ? -n : n выглядит куда лучше семистрочного if/else.
    - не дублировать код когда этого легко избежать:
    if(n<0) {
        cout<<"-";
    }


    Ну и добавлю, что у этого кода есть проблема с обработкой входного значения -2147483648.
    Ответ написан
    Комментировать
  • Как можно улучшить код?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    В задании же написано:
    Используйте процедуру.


    Разбейте на функции. Хотя бы выделите основной алгоритм в функцию, которая возвращает вектор из цифр. Отдельную функцию для вывода. символов. Минус можно вывести отдельно.
    Ответ написан
    Комментировать
  • Как правильно реализовать освобождение памяти выделенной в функции?

    @dima20155
    you don't choose c++. It chooses you
    Все до безобразия просто:
    Вы выделяете память в момент, когда она вам нужна, а удаляете когда эта память вам более не нужна.
    Соотвественно, вам нужна функция array_deinit(), которая возьмет на себя непосильную ношу освобождения памяти в момент, когда вы больше не планируете обращаться к своему двумерному массиву.

    В простейшем случае, в С++ подобный функционал оборачивают в класс, который, в свою очередь, обязательно должен почистить за собой память хотя бы в деструкторе.

    Также в современном С++ не принято использовать new/delete без веской причины (например, вы пишете супер быстрый, современный контейнер, в котором хотите управлять всеми аллокациями самостоятельно), а рекомендуется использовать умные указатели для работы с памятью.
    Ответ написан
    2 комментария
  • Возможно ли как-то использовать обычную функцию заместо макро-функции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    #define BIT_SET(port, bit) (port |= (1 << bit))
    
    int main(void)
    {
        BIT_SET(PORTB, PORTB0);
    }


    вот такой вариант, с макро-функцией, работает, так как это просто текстовая замена

    Он работает, потому что с таким определением BIT_SET PORTB не может быть определён просто как 0x04. Потому что просто текстовая замена 0x04 |= 1 << 0 не имеет смысла. Он определён как volatile ссылка на память с адресом 0x04. Когда ты научишься передавать ссылку на такую память в функцию, функция тоже начнёт работать.
    Ответ написан
    3 комментария
  • Как хранится c++ struct в памяти и как определить размер вручную?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    поэтапаный алгоритм определения размера

    Если откинуть тонкости связанные с битовыми полями, то алгоритм простой. Обозначим выравнивание всей структуры A, размер всей структуры S, размер головы структуры из i полей Si, размер i-го поля SFi, выравнивание i-го поля AFi, операцию округления X вверх до ближайшего кратного Y R(X, Y) (т.е., например, R(4, 4) = 4, R(5, 4) = 8), количество полей структуры n. Тогда

    S0 = 0
    Si = R(Si - 1, AFi) + SFi
    A = maxi = 1..n(AFi)
    S = R(Sn, A)

    Второй и третий шаги гарантируют, что в выравненной структуре каждое поле тоже выравнено.
    Четвёртый шаг гарантирует, что если такие структуры поместить в массив, то все элементы массива будут одинаково выравнены.

    Разумеется всю эту математику имеет смысл делать если пишешь компилятор, во всех остальных случаях размеры и выравнивания структур можно узнать непосредственно у компилятора.
    Ответ написан
    Комментировать
  • Почему умножение матрицы 8x8 медленнее чем 10x10?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скорее всего тут дело в кеше процессора. После первых запусков так получилось, что данные оказались в кеше.

    Вообще, писать бенчмарки - очень сложно. Надо сначала прогонять тест несколько раз и отбрасывать результаты, а уже потом мерять. Надо быть очень внимательным, если вы запускакте разные тесты в одной программе подряд: результаты работы одного теста могут повлиять на остальные.

    Ну и главное, выполнять такое короткое действие всего один раз - это вообще моветон. Надо выполнить его сотню тысяч раз и потом общее время делить на количество запусков. Иначе вы меряете случайный шум в основном. Может тут вам просто все время (не)везет и вот так третий тест оказывается быстрее остальных.
    Ответ написан
    3 комментария
  • Как в С++ проверить double на целочисленность?

    @vanyamba-electronics
    При обработке вещественных чисел следует определиться, которая точность вас устраивает в данном случае.
    В идеале 1.0 - это явно целочисленная дробь, но на практике возникает вопрос: а 0.99999999 - это достаточное приближение, чтобы принимать это число за 1.0?
    Поэтому функция должна иметь параметр точности:
    bool is_integer(double val, double precision = 0.000005)
    {
        return abs(val - round(val)) < precision;
    }
    Ответ написан
    2 комментария
  • Нужно ли взять деньги за оценку больших ТЗ веб-разработчику?

    Нужно. Назови это чем-то типа "анализ и уточнение технического задания, и составление плана работ " назначь цену изходя из размера ТЗ и количества необходимых созвонов и доработок.

    Дай скидку, если в итоге решите сотрудничать.

    В случае возражений - проведи аналогию с реальным миром: замер окон, геодезические работы перед стройкой, итд.

    Если скажет что другие исполнители не берут деньги за это - напомни про скидку и скажи, что это тоже работа и оно позволяет точнее предсказать цену и, меньше затягивать сроки, и не делать лишних правок ближе к концу проекта.
    Ответ написан
    1 комментарий
  • Как закрыть командную строку после выполнения?

    @pumpkinm
    Добавить start """ """
    runas.exe /user:admin /savecred "cmd /C start """ """ """C:\Program Files\Corel\CorelDRAW Graphics Suite 2022\Programs64\CorelDRAW.exe"""
    Ответ написан
    1 комментарий
  • Где могла закрасться ошибка?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    В вашем рассуждении ошибка в том, что вы не домножаете условную вероятность 2/6 на вероятность условия. Вы же полную вероятность считатете а P(A) = P(A|B)*P(B)+P(A|!B)*P(!B). У вас P(A|B) = 0, как вы заметили - если они встретились в первом туре, то во втором уже не встретятся. Но все-равно надо 2/6 домножать на P(!B) - вероятность того, что они не встретились в первом туре. А это 1-1/7 = 6/7. В итоге получается все то же 2/6*6/7=2/7.

    Но рассуждения автора проще. Можно рассмотреть все независимые элементарные исходы "где в сетке оказался второй игрок". Их 7, они равновероятны по симметрии. Дальше надо домножить на вероятность, что они начиная так встретятся (выиграют свои матчи).
    Ответ написан
    4 комментария
  • Почему файл из github постоянно на ~37% больше, чем указан?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А вы сами то открывали файл по ссылке из data.git_url?
    Там отдаётся JSON с файлом, закодированным в Base64.
    В Base64 каждые 6 бит исходного файла кодируются одним символом (8 бит) текста, а после каждых 60 символов добавляется символ переноса строки. Вот и получаем ~ (2/6 + 8/360) = 35.6% дополнительно к объёму.
    Если хотите получить файл сам по себе, то используйте поле download_url.
    Ответ написан
    4 комментария