LINUX.ORG.RU

как оптимизировать с++ код, чтобы 7000 бинарников не выедали всё cpu

 , , , ,


2

3

https://imgur.com/RcrmzW0.png

https://imgur.com/Z4wdNBA.png

Код простой, в простое опрашивает ивенты, больше ничего не происходит.

- запускаю 1000-3000 бинарников - всё ок
- на 7000 бинарников - картина на скрине

Возможно у кого-то есть какие-то идеи куда смотреть и почему так просходит? откуда это ограничение в 7000

код очереди

std::optional<T> pop() {
        std::unique_lock<std::mutex> lock(this->mutex);

        if (q.empty()) {
            return std::nullopt;
        }

        std::optional<T> value = std::move(this->q.front());
        this->q.pop();

        return value;
    };


код опроса инвентов (он и генерит лоад)
while (true) {
        auto tick_start = std::chrono::steady_clock::now();

        if (auto event = internal_events_.pop(); event) {
            std::visit([this](auto &&casted_event) {
                process_event(casted_event);
            }, event.value());
        }

        if (auto event = my_events_.pop(); event) {
            using namespace td::td_api;
            auto &&object = event.value();
            switch (object->get_id()) {
                case updateMyActivity::ID:
                    process_event(move_object_as<updateMyActivity>(object));
                    break;
                case updateMyActivity2::ID:
                    process_event(move_object_as<updateMyActivity2>(object));
                    break;
                default:
                    break;
            }
        }

        if (auto event = my_q_events_.pop(); event) {
            std::visit([this](auto &&casted_event) {
                process_event(casted_event);
            }, event.value());
        }

        auto tick_end = std::chrono::steady_clock::now();
        auto duration = tick_end - tick_start;
        auto sleep_time = std::chrono::milliseconds(10) - duration;
        if (sleep_time.count() > 0) {
            std::this_thread::sleep_for(sleep_time);
        }
    }

★★★★★

Последнее исправление: smilessss (всего исправлений: 2)
Ответ на: комментарий от smilessss

это я пробую его оптимизировать

...
        auto tick_end = std::chrono::steady_clock::now();
        auto duration = tick_end - tick_start;
        std::this_thread::sleep_for(duration);

искусственный разум нового поколения. больше тормозит - больше спит.

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

я выкинул всю логику и оставил там просто спать 1000

smilessss ★★★★★
() автор топика
Последнее исправление: smilessss (всего исправлений: 1)
Ответ на: комментарий от smilessss

Красное на ползунках CPU - ядро. У тебя просер на переключении контекста. Прекращай. Трупа не реанимировать, нужно архитектуру переделывать.

hatred ★★★
()
Ответ на: комментарий от hatred

да
если там есть главный ивент который запускает всё

если он не поступил
то делать ничего не нужно

smilessss ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.