Является хороший многопоточный дизайн преждевременной оптимизацией?

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

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

Что Ваш путь состоит в том, чтобы сохранить равновесие между оптимизацией и добиванием цели?

10
задан Lothar 22 January 2010 в 22:02
поделиться

9 ответов

Полагаю, что нить также подчиняется законам оптимизации.
То есть, не тратьте время на параллельные быстрые операции.
Вместо этого, применяйте потоки к задачам, выполнение которых занимает много времени.

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

1
ответ дан 3 December 2019 в 17:20
поделиться

Внесение резьбы не автоматически Увеличить производительность.

4
ответ дан 3 December 2019 в 17:20
поделиться

Я считаю, что нить также подчиняется законам оптимизации.
То есть не тратьте свое время, делая быстрые операции параллельно.
Вместо этого нанесите потоки к задачам, которые требуют длительного времени для выполнения.

Конечно, если системы начнут 1000+ ядер, то этот ответ может стать устаревшим и необходимо пересмотреть. Но опять же, если вы собираетесь «получить вещи», то вы окончательно хотите отправить ваш продукт до этого.

-121--3518762-

Если вы следите за трубопроводом и и Map-United .
Разложите вещи, чтобы вы могли , выполняемый в многоперерабатывающем трубопроводе уровня ОС.

Вы можете на самом деле запускать в реальном конвейере. Нет дополнительных работ. ОС обрабатывает все. Огромная возможность ускорения.

Вы также можете переключиться на потоки. Маленькая работа. ОС обрабатывает некоторые части этого, библиотеки потоков обрабатывают остальные. Однако, поскольку вы думали «Процесс» по времени проектирования, ваши темы не имеют путающих проблем обмена данными. Большая победа для небольшого мышления.

-121--3518763-

Говорят, что дни кодирования могут сэкономить часы дизайна.

Не все проблемы, ни рамки не являются многопоточными. Библиотеки, на которые вы зависят, например, не могут быть без потока. Многие процессы естественным образом являются последовательными и не могут быть разбиты на распараллелизуемые части.

И ходьба мульти-резьбо / многопроцессор - это просто один из способов параллелизны. Вы также можете использовать, например, асинхронный IO.

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

2
ответ дан 3 December 2019 в 17:20
поделиться

Может быть, хорошая вещь - это проектирование систем с некоторыми характеристиками , поэтому, если вы хотите ввести многопоточье , вы можете сделать это изящно .

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

Такие вещи кажутся мне важными.

Если это проектирование для многопотативного ... Тогда важно преждевременный подход.

Если это просто обеспечивает некоторые характеристики, которые позволяют расширить масштабирование или многопоточье в будущем: тогда это не так важно :)

Редактировать Ой, я снова прочитал: преждевременной оптимизации?

Оптимизация: я не Это хорошо, пока у вас нет работы системы (и без пороков, приходящих от попытки оптимизировать вещи). Сделайте чистый дизайн, что-то гибкое и простое самое. Далее вы можете оптимизировать, когда вы видите, что действительно нужно.

1
ответ дан 3 December 2019 в 17:20
поделиться

Я бы никогда не рассматривал проектирование для многопоточьего в применении чисто для спекулятивных соображений производительности. Это потому, что с несколькими методами, которые хороши для любого приложения, легко сделать операцию Multi-Threaded позже. Техни, о которых я думаю:

  • Card Const Contons
    • В C ++ вы можете пометить метод в виде Const, что означает, что он не изменяет значение переменных экземпляров. Вы также можете пометить входной параметр в метод в качестве Const, что означает, что только темы Const могут быть вызваны на этом параметре. С этими двумя методами (и не используя «трюки», чтобы обойти эти подстановки компилятора), вы можете сопутать операции, которые должны быть в курсе.
  • Инверсия зависимости
    • Это общая техника, в которой любые внешние объекты, необходимые объектом, передаются ему при времени конструкции / инициализации или как часть подписи метода для конкретного метода. С помощью этой техники это на 100% ясно, какие объекты могут быть изменены путем операции (переменные экземпляра Non-Const, а также параметры не-COND для операции.) Знание того, что вы знаете, что вы знаете о возможностях нефункциональных аспектов Операция, и вы можете добавить мьютексы и т. Д. К объектам, которые могут быть переданы между параллельными операциями. Затем вы можете разработать свой параллелизм, чтобы быть правильным и эффективным.
  • Функциональ FALL по процедурному
    • По иронии судьбы, это означает, что не допускается преждевременно оптимизировать. Сделайте ценные объекты неизменными. Например, в C # строки неизменяются, что означает, что любые операции на них возвращают новые экземпляры строковых объектов, не модифицированные экземпляры существующей строки. Единственные объекты, которые не должны быть неизменными, являются неограниченными массивами или объектами, которые содержат неограниченные массивы, если эти массивы, вероятно, будут часто модифицированы. Я бы утвердовал, что неизменные объекты легче понять. Многие программисты преподавали процессуальные методы, так что это несколько чужой нам, но когда вы начинаете думать в неизменяемых терминах, ужасные аспекты прешедных программиров, таких как порядок эксплуатации зависимости и побочных эффектов. Эти аспекты еще более ужасны в многопоточной программировании, поэтому использование функционального стиля в конструкции класса помогает во многих отношениях. Поскольку машины растут быстрее, более высокая стоимость неизменных объектов становится проще и легче оправдать. Сегодня это баланс.
1
ответ дан 3 December 2019 в 17:20
поделиться

Существует три основных варианта дизайна: синхронизация, async или Sync + Multi Threaded. Выберите один или несколько, чем один, если у вас уныние мужчины.

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

Если синхронизация не соответствует требованиям заказчика:

CPU Limited Systems требует выбора многопоточных / процессов

Limited Systems (наиболее распространенным) часто может пойти либо Async, либо MT.

Для технологий, использующих IO, такие как состояние потоков, могут позволить вам иметь свой пирог и есть его тоже. (Sync Design / W Async-исполнение)

1
ответ дан 3 December 2019 в 17:20
поделиться

Если следовать шаблонам проектирования Трубопровода и Карта-Сброс , этого должно быть достаточно.
Разложите вещи так, чтобы вы могли работать в многопроцессорном конвейере на уровне операционной системы.

Тогда вы можете фактически работать в реальном конвейере. Никакой дополнительной работы. Операционная система справляется со всем. Огромная возможность ускорения.

Вы также можете переключиться на потоки. Небольшая работа. Операционная система обрабатывает некоторые части, библиотеки тем - остальные. Однако, поскольку вы думали о "процессе" во время проектирования, в ваших потоках нет никаких запутанных проблем с обменом данными. Большая победа для небольшого размышления.

9
ответ дан 3 December 2019 в 17:20
поделиться

Как и другие указали на синтаксис (? ....) .

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

string s = "foo=bar/baz=qux";
Regex regex = new Regex(@"(?<Key>\w+)=(?<Value>\w+)");
foreach (Match match in regex.Matches(s))
{
    Console.WriteLine("Key = {0}, Value = {1}",
        match.Groups["Key"].Value,
        match.Groups["Value"].Value);
}

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

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

-121--3665341-

Темы существуют, чтобы проще прославить работу нескольких агентов.

  • Если агенты - это пользователи, вроде бы, если у вас есть нить пользователя, они облегчают запись программы. Это не проблема с производительностью, это проблема с легкостью письма.

  • Если агенты - это устройства ввода / вывода, они облегчают написать программу, которая делает ввод / вывод в параллельном. Это может или не может быть сделано для производительности.

  • Если агенты являются CPU CORES, они облегчают писать программы, которые получают несколько сердечников, которые находятся параллельно. То есть когда потоки коррелируют с производительностью.

Другими словами, если вы думаете, что потоки == параллелизм == Performance, это только ударяет одно из используемых потоков.

1
ответ дан 3 December 2019 в 17:20
поделиться

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

3
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

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