IME, основная проблема во многих проектах заключается в том, что разработчики используют низкоуровневые функции C ++, такие как ручное управление памятью, обработка строк в стиле C и т. Д., Хотя они очень редко когда-либо необходимы (а затем только хорошо инкапсулированы в классы) , Это приводит к повреждению памяти, неверным указателям, переполнению буфера, утечке ресурсов и так далее. Все время хорошие и чистые конструкции высокого уровня доступны.
Я был частью команды для большого (несколько MLoC) приложения в течение нескольких лет, и количество сбоев в различных частях приложения хорошо коррелировало со стилем программирования, используемым в этих частях. На вопрос, почему они не меняют свой стиль программирования, некоторые из виновников ответили, что их стиль в целом дает большую производительность. (Мало того, что это неправильно, это также факт, что клиенты скорее имеют более стабильную, но более медленную программу, чем быструю, которая продолжает падать на них. Кроме того, большая часть их кода даже не требовала быть быстрой ...)
Что касается многопоточности: я не чувствую себя достаточно опытным, чтобы предлагать здесь решения, но я думаю, Столбцы Херба Саттера «Эффективный параллелизм» очень полезны для чтения по этому вопросу.
Изменить для обсуждения обсуждений в комментариях :
Я не писал, что "обработка строк в стиле C не является более производительной". (Конечно, в этом предложении много отрицания, но, поскольку я чувствую себя неправильно, я стараюсь быть точным.) Я сказал, что конструкции высокого уровня в целом не менее производительны: std::vector
не в целом * На 1015 * медленнее, чем выполнение динамически размещаемых массивов C, поскольку это динамически размещаемый массив C. Конечно, есть случаи, когда что-то, закодированное в соответствии со специальными требованиями, будет работать лучше, чем любое общее решение - , но это не обязательно означает, что вам придется прибегнуть к ручному управлению памятью . Вот почему я написал, что если такие вещи необходимы, то только хорошо инкапсулированные в классах.
Но что еще более важно: в большинстве кодов разница не имеет значения. Нажатие кнопки на 0,01 с после нажатия на нее или 0,05 с просто не имеет значения, поэтому даже увеличение скорости в 5 раз не имеет значения для кода кнопки. Однако в случае сбоя кода значение всегда имеет значение.
Подводя итог моему аргументу: сначала заставьте его работать правильно. Лучше всего это сделать, используя хорошо зарекомендовавшие себя готовые строительные блоки. Тогда измерить. Затем улучшите производительность там, где это важно, используя хорошо зарекомендовавшие себя готовые идиомы.