169 похожих чатов

Если писать программу "от потоков данных" а не "потоков исполнения",

и при условии что сама задача параллелится, то можно сколько угодно занять ядер.

...я недавно в легаси переписывал. Там сначала 30% времени все грузилось из БД в основном потоке.

Потом в статике создавалось 100500 потоков (буквально, каждому потоку назначался диапазон, тебе с 0 по 99 строку, тебе с 100 по 199, и т. д. до конца TList.)

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

Каждый из этих воркеров каждую отраьотанную строчку засовывал в VTV. По одной. Через Synchronize. Без BeginUpdate.

На последнее тратилось примерно 40%.

В промежутке работало примерно 1/2 потоков от аьстратного максимума, остальные ждали таймера.

Ах да, 10 потоков 4 ядра к сожалению оказались неспособны загрузить на 250%, только на 100.

Вопрос: это Дельфи была виновата, что это ТАК писали?

Ну, в какой-то мере да, что не было из коробки других библиотек типа OTL.

Но не только Дельфи. На СО до сих пор бывают вопросы, типа я сделал сто потоков, каждый из которых на 100% состоит из одного synchronize, где моё 100-кратное ускорение?...

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

27 ответов

91 просмотр

А как правильно будет?

Arioch-The Автор вопроса
Неъматжон
А как правильно будет?

Потоков почислу ядров с небольшим запасом сверху. Поток освободился, взял фрейм данных на одной из стадий обработки (OTL Pipeline например) отработал, положил на вход следующей стадии. С какой именно стадии он берет фрейм решает либа, которая видит всю трансформации и видит на каких шагах пробки образуется и туда перекидывать воркеров с других звеньев.

Стикер

Ты на вопрос слишком просто смотришь. Возьми не десктопное приложение, а что-то серверное. Там потоков обычно больше чем количество ядер. Ибо потоки могут выполнять не только прямые задачи для распараллеливания, но и фоновые задачи. Опять же есть класс задач, где syscall примитивов синхронизации, вроде мьютексов, противопоказан. Там уже атомики рулят. Есть free-lock структуры... В общем тема это сложная

Стикер

Arioch-The Автор вопроса
Denis Simonov
Ты на вопрос слишком просто смотришь. Возьми не де...

Фоновые задачи не должны прямо влиять на основные, не? Если они фоновые... А вот в одном месте, куда я не пошёл ибо далеко ездить, переписывались сервер на 64 бита, потому что память скончалась, если слишком много запросов=потоков было. Рассказал им про $M и размер стека, может помогло, не знаю :) Ладно, я оффлайн, конец года сцуко, внезапно появились несколько ледлайнов как всегда.

Denis Simonov
Ты на вопрос слишком просто смотришь. Возьми не де...

Нет там ничего сложного. Достаточно для разработки и тестирования использовать не топовый комп, а какой-нибудь селерон с 2 ГБ памяти. Тогда в продакшене оно будет гарантированно летать с многократным запасом.

Sergey Bodrov
Нет там ничего сложного. Достаточно для разработки...

Это несусветная чушь. Как ты многопоточность протестируешь на всяком говне? Я не спорю, именно однопоточный алгоритм можно тестировать на древнем одноядерном проце, но с многопоточностью это в корне не верно

Denis Simonov
Это несусветная чушь. Как ты многопоточность проте...

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

Nik
Т.е. мне свой AMD Ryzen 7 7700x выкинуть, да? 🤔

Я бы запустил эмулятор (виртуалку), но твой вариант мне тоже нравится. =)

Sergey Bodrov
Я бы запустил эмулятор (виртуалку), но твой вариан...

Эта фиговина авторазгон до 5,4 ГГц включает)

Sergey Bodrov
А ты попробуй. На слабом железе проблемы лучше вид...

Давай ты не будешь говорить о том в чём не смыслишь. Всё зависит от частоты вызова примитивов синхронизации. Попробуй сделать что-то более сложное чем параллельный экспорт. Ну например общий страничный кеш для СУБД. Если делать это в лоб, то есть поставить ровно один мьютекс на весь кэш, то толку от многопоточности там будет 0.

Sergey Bodrov
Я бы запустил эмулятор (виртуалку), но твой вариан...

Я тут себе на али прикупил железо для сервера на Intel Xeon E5 2670 v3 - в 10 тыс уложился (мать, проц, 16 ГБ ОЗУ DDR4 ECC, кулер, блок питания)

Извиняюсь. Я думал это ты написал так. А это был пример кривой реализации. Тогда согласен с написанным, за исключением того что потоков всегда должно быть столько сколько ядер. Не всегда, но количество потоков надо ограничивать, то есть для рабочих задач делать пул потоков, а не постоянное создание/уничтожение потоков. Фоновые потоки сами по себе без пула, обычно существуют всё время существования приложения

Denis Simonov
Давай ты не будешь говорить о том в чём не смыслиш...

На слабом железе эта проблема будет больше и раньше заметна, чем на мощном. На мощном этот кеш с мутексом может вообще не понадобится, вся БД в памяти закешируется еще на уровне ОС и файловой системы. А также десятки других проблем, которые прощает мощное железо.

Sergey Bodrov
На слабом железе эта проблема будет больше и раньш...

Наивный. В многопоточном программировании намного больше проблем чем ты думаешь. Это не только data race, но и взаимоблокировки (deadlock), leavelock, голодающие потоки, честное распределение и много другое. Многие вещи можно поймать только под нагрузкой. А какую нагрузку можно создать на хилом проце?

Denis Simonov
Наивный. В многопоточном программировании намного ...

Дяденька, я не настоящий сварщик, я просто хайлоад для систем масштаба страны пишу, а слов таких стараюсь избегать.

Boris Usievich
И вы этот хайлоад на дельфи пишете🧐?

Да. Часть на PHP, всякие веб-интерфейсы и веб-API. Есть скрипты на JavaScript. Есть немного на Си, там свой диалект, совместимый с дельфями - строки, массивы, Variant.

Boris Usievich
А если не секрет, что именно пишете?

Системы для МВД, МЧС, минздрав, минобр. От драйверов связи до распределенных баз, серверов, настольных, мобильных и веб рабочих мест

Denis Simonov
Наивный. В многопоточном программировании намного ...

На хилом проце всё как раз и всплывет. Чем говеннее тестовая машина, тем больше глюков наловить можно.

Arioch-The Автор вопроса
Denis Simonov
Извиняюсь. Я думал это ты написал так. А это был п...

Я насчёт количества имел в виду потоки конкретной задачи (потока данных). Другие потоки или задачи , управляемые другим менеджером, они отдельно.

Arioch-The Автор вопроса
Константин Тимофеев
На хилом проце всё как раз и всплывет. Чем говенне...

Прям так и всё... Ну... Например возьмём lock-free что-нибудь. В котором забыли атомарные инкременты (обычный ткнул) или барьеры памяти или ещё что-то. Запускаем "на хилом проце" . На одноядерном (остальное будет менее хилым). Упс, внезапно всё работает и баг скрылся. Чтобы баг выловить надо поймать физически одновременный инкремент из 2 потоков. При этом слабый проц вероятность этого не увеличит (одна команда ассемблера, её даже атомом не затормозишь). А вот количество потоков и частота инкрементов (обратно пропорционая длительности обработки данных) - т.е. крутость процессора - вполне. Наверное если порыться, можно даже академический статьи найти, какого рода баги скорее выявляются на слабых машинах, а какого рода на сильных. При том, что я в целом симпатизирую тезису "компы разработчика и тестера должен быть хуже среднего компа клиента" :-) Но с некоторыми багами лучше наоборот.

Arioch The
Прям так и всё... Ну... Например возьмём lock-fr...

Что касается багов с многопоточностью я лично сделал для себя следующий вывод: 1. Ловить их лучше на многоядерной, но хилой конфигурации. Т.е. у меня был пример когда на виртуалке с одним ядром вероятность ошибки была маленькой, но при выделении 4-х ядер баг стал совершенно очевиден. 2. Тестировать задачу надо по возможности при максимальной загрузке потоков (т.е. например расчётную задачу пускать на расчёт с максимальной скоростью без искусственных задержек. Ну то есть к примеру если цель тестирования именно выявление багов связанных с распараллеливанием, то это в любом случае подразумевает многоядерную тестовую систему.

Arioch The
Прям так и всё... Ну... Например возьмём lock-fr...

у разработчика комп должен быть быстрый, чтобы быстро компилить ) а вот тестеру(ам) надо зоопарк разных компов

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта