В то время как мне нравится интеллектуальная проблема, прибывающая из дизайна многоядерных систем, я понимаю, что большинство из них было просто ненужной преждевременной оптимизацией.
Но с другой стороны обычно все системы имеют некоторую потребность производительности, и рефакторинг ее позже в безопасную работу многопоточности труден или даже просто экономно не возможен, потому что это было бы полное, переписывают с другим алгоритмом.
Что Ваш путь состоит в том, чтобы сохранить равновесие между оптимизацией и добиванием цели?
Полагаю, что нить также подчиняется законам оптимизации.
То есть, не тратьте время на параллельные быстрые операции.
Вместо этого, применяйте потоки к задачам, выполнение которых занимает много времени.
Конечно, если в системах начинается 1000+ ядер, то этот ответ может устареть и потребовать доработки. Но опять же, если вы собираетесь "сделать что-то", то вы определенно захотите отправить ваш продукт до этого момента.
Внесение резьбы не автоматически Увеличить производительность.
Я считаю, что нить также подчиняется законам оптимизации.
То есть не тратьте свое время, делая быстрые операции параллельно.
Вместо этого нанесите потоки к задачам, которые требуют длительного времени для выполнения.
Конечно, если системы начнут 1000+ ядер, то этот ответ может стать устаревшим и необходимо пересмотреть. Но опять же, если вы собираетесь «получить вещи», то вы окончательно хотите отправить ваш продукт до этого.
-121--3518762- Если вы следите за трубопроводом и и Map-United .
Разложите вещи, чтобы вы могли , выполняемый в многоперерабатывающем трубопроводе уровня ОС.
Вы можете на самом деле запускать в реальном конвейере. Нет дополнительных работ. ОС обрабатывает все. Огромная возможность ускорения.
Вы также можете переключиться на потоки. Маленькая работа. ОС обрабатывает некоторые части этого, библиотеки потоков обрабатывают остальные. Однако, поскольку вы думали «Процесс» по времени проектирования, ваши темы не имеют путающих проблем обмена данными. Большая победа для небольшого мышления.
-121--3518763-Говорят, что дни кодирования могут сэкономить часы дизайна.
Не все проблемы, ни рамки не являются многопоточными. Библиотеки, на которые вы зависят, например, не могут быть без потока. Многие процессы естественным образом являются последовательными и не могут быть разбиты на распараллелизуемые части.
И ходьба мульти-резьбо / многопроцессор - это просто один из способов параллелизны. Вы также можете использовать, например, асинхронный IO.
По моему опыту, идя асинхронному из одной нити намного, чем проходит мульти-резьбовое. Но потом, программы, которые я пишу решать разные проблемы, ну, в значительной степени все остальные.
Может быть, хорошая вещь - это проектирование систем с некоторыми характеристиками , поэтому, если вы хотите ввести многопоточье , вы можете сделать это изящно .
Я не уверен, что это такое характеристики, но один аналоговый пример приходит к моему мнению: масштабирование. Если вы проектируете небольшие операции, которые система бездействия может выполнять, вы сможете масштабироваться более естественным образом.
Такие вещи кажутся мне важными.
Если это проектирование для многопотативного ... Тогда важно преждевременный подход.
Если это просто обеспечивает некоторые характеристики, которые позволяют расширить масштабирование или многопоточье в будущем: тогда это не так важно :)
Редактировать Ой, я снова прочитал: преждевременной оптимизации?
Оптимизация: я не Это хорошо, пока у вас нет работы системы (и без пороков, приходящих от попытки оптимизировать вещи). Сделайте чистый дизайн, что-то гибкое и простое самое. Далее вы можете оптимизировать, когда вы видите, что действительно нужно.
Я бы никогда не рассматривал проектирование для многопоточьего в применении чисто для спекулятивных соображений производительности. Это потому, что с несколькими методами, которые хороши для любого приложения, легко сделать операцию Multi-Threaded позже. Техни, о которых я думаю:
Существует три основных варианта дизайна: синхронизация, async или Sync + Multi Threaded. Выберите один или несколько, чем один, если у вас уныние мужчины.
Да, вы должны понимать приемлемые ожидания производительности ваших клиентов во время этапа проектирования вашего приложения, чтобы иметь возможность сделать правильный выбор передней. Для любого нетривиального проекта может быть довольно опасным и трудоемким для лечения высокоуровневых выгодных проявлений в качестве запоздалогов.
Если синхронизация не соответствует требованиям заказчика:
CPU Limited Systems требует выбора многопоточных / процессов
Limited Systems (наиболее распространенным) часто может пойти либо Async, либо MT.
Для технологий, использующих IO, такие как состояние потоков, могут позволить вам иметь свой пирог и есть его тоже. (Sync Design / W Async-исполнение)
Если следовать шаблонам проектирования Трубопровода и Карта-Сброс , этого должно быть достаточно.
Разложите вещи так, чтобы вы могли работать в многопроцессорном конвейере на уровне операционной системы.
Тогда вы можете фактически работать в реальном конвейере. Никакой дополнительной работы. Операционная система справляется со всем. Огромная возможность ускорения.
Вы также можете переключиться на потоки. Небольшая работа. Операционная система обрабатывает некоторые части, библиотеки тем - остальные. Однако, поскольку вы думали о "процессе" во время проектирования, в ваших потоках нет никаких запутанных проблем с обменом данными. Большая победа для небольшого размышления.
Как и другие указали на синтаксис (?
.
Вот пример, демонстрирующий, как создать группу, называемую клавишу
и группе, называемую значение
, и одинаково важно (но часто забытые) - как извлекать группы по имени из Результирующий объект матча:
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, это только ударяет одно из используемых потоков.
Если вы делаете что-то несколько сложное, многопоточное, то лучше подумайте об этом/проектируйте это заранее. В противном случае, ваша программа либо окажется полной катастрофой, либо будет работать идеально MOST того времени и делать сумасшедшие вещи в другой части времени. Сложно спроектировать что-то доказуемо правильное при многопоточности, однако это чрезвычайно важно. Поэтому нет, я не думаю, что хороший многопоточный дизайн - это преждевременная оптимизация.