2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Производительность многопоточности в чистом Си и async C#
Сообщение03.04.2024, 14:11 


04/03/24
7
Добрый день! Подскажите, пожалуйста, как правильно реализовывать многопоточное приложение на чистом Си, чтобы оно показывало лучшую производительность, чем async/await C#? Дело в том, что сколько я ни пытался, мне не удалось добиться в C# с использованием класса Thread лучшего результата, чем даёт async/await, поэтому опасаюсь, что при переходе на Си возникнет проблема производительности.

 Профиль  
                  
 
 Re: Производительность многопоточности в чистом Си и async C#
Сообщение03.04.2024, 18:17 
Заслуженный участник
Аватара пользователя


01/08/06
3127
Уфа
Про многопоточные приложения почти ничего не знаю.
Когда-то пытался на голых потоках сделать параллельное перемножение матриц, чисто чтобы познакомиться с темой. Но с наскока не получилось, а серьёзнее попробовать не захотел.
С тех пор так и осталось ощущение, что это весьма непросто, особенно добиться производительности.
За всю жизнь очень много раз надо было что-то заметно ускорить, но даже не пытался в эту сторону глядеть, в однопоточном режиме оптимизировал.
А у вас что за задача, что прирост производительности по сравнению с однопоточным вариантом сразу виден?

 Профиль  
                  
 
 Re: Производительность многопоточности в чистом Си и async C#
Сообщение03.04.2024, 19:11 
Заслуженный участник


20/08/14
11761
Россия, Москва
Писанины будет больше, а толку столько же.
К тому же на С можно и не останавливаться, а сразу и WinAPI использовать (или аналогичный интерфейс любой другой ОС).
Тут многое зависит от задачи и от разбиения её на множество подзадач (считаемых параллельно), нередко накладные расходы на связь подзадач между собой намного превышают накладные расходы на организацию многозадачности и потому как именно она организована уже без разницы.
Если надо ускорить выполнение многозадачного кода, то стоит укрупнять куски разбиения задачи, но не превышать нескольких процентов от общего (чтобы не ждать слишком долго завершения последних подзадач), но и не дробить задачу на куски длительностью микросекунды (слишком долгим будет вызов функций ОС), для себя оптимальным считаю длину подзадач в десятки миллисекунд. Уменьшать количество точек взаимодействия подзадач друг с другом. Уменьшать объёмы перезаписываемой информации в каждой подзадаче. Максимально много данных объявлять константными чтобы они не дублировались в каждую подзадачу (если компилятор это позволяет, не дублировать). По возможности использовать более простые механизмы синхронизации/арбитража подзадач друг с другом (в идеале - только критические секции с не слишком долгим кодом в них).
Перехода на более простой/примитивный язык программирования в этом списке нет - слишком мал эффект от этого (в плане организации многозадачности, не самих вычислений). Стоит задумываться когда исчерпаны все другие возможности. Тем более что высока вероятность что придётся реализовывать самому почти весь функционал механизмов арбитража более продвинутого языка, с неизбежными ошибками и временем на написание и отладку, ну кроме совсем уж простых случаев (скажем на которые хватает критических секций).

worm2 в сообщении #1635228 писал(а):
А у вас что за задача, что прирост производительности по сравнению с однопоточным вариантом сразу виден?
Таких задач полно, вопрос насколько в ней критичны именно накладные расходы организации многозадачности и синхронизации потоков между собой. Часто можно чуть по другому побить задачу на куски и все накладные расходы уходят ниже 1% общего времени. Без смены языка.
К тому уже у ТС уже многопоточный код, но он зачем-то хочет переписать его на более примитивном языке, ожидая выигрыша скорости, чего вполне может и не быть.

 Профиль  
                  
 
 Re: Производительность многопоточности в чистом Си и async C#
Сообщение15.08.2024, 02:00 
Аватара пользователя


07/02/12
1433
Питер
Astronavt в сообщении #1635172 писал(а):
Добрый день! Подскажите, пожалуйста, как правильно реализовывать многопоточное приложение на чистом Си, чтобы оно показывало лучшую производительность, чем async/await C#?
Однозначно можно. Но не всегда рентабельно. Опишите проблему (задачу) детальнее.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group