Асинхронные сокеты всегда будут более эффективными.
Разница между синхронными и асинхронными сокетами заключается в том, что асинхронные сокеты используют порты завершения ввода / вывода вместо блокировки потока.Заблокированный поток потребляет дополнительные ресурсы, в основном память, по сравнению с отсутствием потока вообще.
Говорить о количестве потоков на ядро просто неверно.
Самое эффективное число потоков - это один исполняющий поток наядро.Не больше, не меньше.В вашем случае с синхронным решением потоки будут заблокированы (и, следовательно, не выполняются на процессоре), пока они ждут данных.В асинхронном решении также не будет потоков, выполняющихся на ЦП во время ожидания данных (но будет меньше заблокированных потоков).Количество выполняющихся потоков будет одинаковым в обоих случаях, но асинхронный будет использовать меньше служебной памяти.
Редактировать:
Некоторые примечания относительно точно одного исполняющего потока на ядро.
Чем больше потоков, тем больше издержек на переключение контекста, а меньшее количество потоков приводит к тому, что некоторые ядра простаивают.
Но на самом деле получить идеальное количество потоков - непростая задача, когда ввод / вывод задействован, поскольку потоки не заняты все время.,Поэтому, если у вас есть потоки, заблокированные в ожидании ввода / вывода, у вас может быть больше потоков, чем ядер, но вы должны попытаться сбалансировать избыточное выделение потоков так, чтобы на каждом ядре фактически работал почти один поток.
Редактировать 2:
Еще одна заметка.Не беспокойтесь об эффективности при низкой нагрузке, такой как один или два клиента (если это не фактическое количество пользователей), оптимизируйте для максимально возможной нагрузки, вот тогда производительность будет иметь значение.