Я мог бы быть предвзятым, работая в областях, очень критичных к производительности, таких как обработка изображений и трассировка лучей, но я все же сказал бы, чтобы оптимизировать «как можно раньше» . Независимо от того, насколько критичны ваши требования к производительности, после оценки всегда намного больше информации и ясности, чем заранее, что означает, что даже самые эффективные оптимизации обычно применяются позже после получения таких знаний.
Особые случаи
Но иногда «как можно позже» все еще чертовски рано в некоторых особых случаях. Например, если мы говорим офлайн-рендерерах, то структуры данных и методы, которые вы используете для достижения производительности, на самом деле проникают в пользовательский дизайн., Это может показаться отвратительным, но поле настолько ультрасовременное и настолько критичное к производительности, что пользователи принимают пользовательские элементы управления, специфичные для методов оптимизации, применимых к конкретному raytracer (например, кэширование освещенности или картирование фотонов), поскольку некоторые из них используются часы ожидания для рендеринга изображения, а другие привыкли выплачивать огромные суммы денег для аренды или владения фермой рендера с машинами, предназначенными для рендеринга. Для этих пользователей существует значительное сокращение времени и денег, если конкурентный офлайн-рендеринг может предложить нетривиальное сокращение времени, затрачиваемого на рендеринг. Это своего рода область, где сокращение времени на 5% действительно волнует пользователей.
В таких специфических случаях вы не можете просто выбрать один метод визуализации и надеетесь оптимизировать его позже, так как весь проект, включая пользовательский дизайн, вращается вокруг структур данных и алгоритмов, которые вы используете. Вы не можете даже просто идти с тем, что хорошо сработало для других людей, поскольку здесь, вы, как личность, и ваши конкретные сильные и слабые стороны, в значительной степени влияете на создание конкурентного решения. Мышление и чувствительность основного разработчика, стоящего за Арнольдом, отличаются от тех, кто работает над VRay, которые использовали совсем другой подход; они не могут обязательно поменяться местами / техниками и выполнять лучшую работу (даже при том, что они оба промышленные лидеры). Вы должны что-то вроде эксперимента, прототипа и теста и найти то, что Особенно хорошо это делать, учитывая бесконечное множество передовых технологий, если вы надеетесь выпустить что-то конкурентоспособное, что на самом деле будет продаваться. Таким образом, в этом особом случае проблемы с производительностью выходят на передний план, как, пожалуй, самая важная проблема еще до начала разработки.
Тем не менее, это не обязательно является нарушением оптимизации «как можно позже» , просто «как можно позже» довольно рано в этих крайних и специфических случаях. Выяснение того, когда, а также что не требует таких ранних проблем с производительностью, если вообще когда-либо, является, вероятно, главной проблемой для разработчика. То, что не нужно оптимизировать, может быть одной из самых ценных вещей для изучения и продолжения обучения в карьере разработчика, так как вы не найдете недостатка в наивных разработчиках, которые хотят все оптимизировать (и, к сожалению, даже ветеранов, которым удалось как-то сохранить свою работу в несмотря на их контрпродуктивность).
Как можно позже
Возможно, самая трудная часть состоит в том, чтобы попытаться понять, что это значит. Я все еще учусь и программирую почти три десятилетия. Но особенно сейчас, в третьем десятилетии, я начинаю понимать, что это не так сложно. Это не ракетостроение, если вы сосредоточены больше на дизайне, чем на реализации. Чем больше ваши проекты оставят перед вами пространство для соответствующей оптимизации без изменений в дизайне, тем позже вы сможете оптимизировать. И все больше и больше производительности я приобрел, ища такие конструкции, которые предоставляют мне эту передышку.
Дизайн, который предлагает передышку для оптимизации позже
Эти типы конструкций на самом деле не так сложны в большинстве случаев, если мы можем применить некоторый «здравый смысл». Как личная история, я увлекаюсь изобразительным искусством как хобби (мне кажется, это несколько помогает программировать программы для художников, которые сами понимают их потребности и говорят на их языке), и я провел некоторое время в начале 2000-х, используя апплеты Oekaki. онлайн как быстрый способ рисовать и делиться своими работами и общаться с другими художниками.
В частности, мой любимый сайт и апплет были пронизаны недостатками производительности (любой нетривиальный размер кисти замедлял бы сканирование), но имел очень хорошее сообщество. Чтобы обойти проблемы с производительностью, я использовал маленькие 1 или 2-пиксельные кисти и просто набросал свою работу так:
Тем временем я продолжал давать автору предложения по улучшению производительности, и он заметил, что мои предложения носили сугубо технический характер, говоря об оптимизации памяти, алгоритмах и так далее. Поэтому он на самом деле спросил, был ли я программистом, и я ответил «да», и он пригласил меня поработать над исходным кодом.
Поэтому я посмотрел на исходный код, запустил его, профилировал, и, к своему ужасу, он разработал программное обеспечение на основе концепции «абстрактного пиксельного интерфейса» IPixel
, который, в конечном итоге, стал основной причиной самых популярных горячих точек для всего с динамическим выделения и рассылка для каждого пикселя каждого изображения. Тем не менее, не было никакого практического способа оптимизировать это, не пересматривая весь дизайн программного обеспечения, потому что дизайн загнал его в угол, где нет ничего сверх самой тривиальной микрооптимизации, когда наши абстракции работают на уровне детализации одного абстрактного пикселя. и все зависит от этого абстрактного пикселя.
Я думаю, что это нарушение "здравого смысла", но, очевидно, это не было таким здравым смыслом для разработчика. Но это все равно, что не абстрагировать вещи на таком детальном уровне, когда даже самые базовые сценарии использования будут создаваться миллионами, например, пикселями, частицами или крошечными единицами в гигантском армейском симуляторе. Благожелательно к IImage
(вы можете обрабатывать все форматы изображение / пиксельные нужно при этом громоздкий агрегированного уровня) или IParticleSystem
до IPixel
или IParticle
, а затем вы можете поместить в самом основных и быстро к записи и простым для понимания реализации позади таких интерфейсов и имейте всю передышку, которую вам когда-либо потребуется оптимизировать позже, не пересматривая весь дизайн программного обеспечения.
И это цель, как я вижу это в эти дни. За исключением особых случаев, таких как офлайн-рендеры, описанные выше, проектируйте с достаточным количеством передышек, чтобы оптимизировать их как можно позже, с максимально возможной ретроспективной информацией (включая измерения), и применяйте любые необходимые оптимизации как можно позже.
Конечно, я не обязательно предлагаю начинать с использования квадратичных алгоритмов сложности для входных данных, которые легко достигают нетривиального размера в обычных случаях пользовательского конца. Кто это делает? Но я даже не думаю, что это настолько важно, если реализацию легко заменить позже. Это все еще не серьезная ошибка, если вам не нужно пересматривать какие-либо проекты.