TD; DR:
Был некоторый беспорядок относительно того, что я спрашивал, таким образом, вот движущая идея позади вопроса:
Я всегда хотел, чтобы вопрос был таким, какой он есть. Я, возможно, не сформулировал это хорошо изначально. Но намерение всегда было « модульным, разделенным, слабо связанным, разъединенным, рефакторированным кодом », заметно медленнее по своей природе, чем « монолитный единый блок, выполняющий все в одном месте, один файл, тесно связанный » код. Остальное - это просто детали и различные проявления этого, с которыми я столкнулся тогда, сейчас или позже. Это медленнее точно в некотором масштабе. Как и диск без дефрагментации, вы должны собирать фрагменты отовсюду. Это медленнее. Точно. Но я должен заботиться?
И вопрос не о ...
не о микрооптимизации, преждевременной оптимизации и т. д. Речь идет не о «оптимизировать ту или иную часть до смерти».
Что тогда?
Речь идет об общей методологии, методах и способах мышления о написании кода, появившегося со временем:
- «внедрить этот код в ваш класс как зависимость»
- "написать один файл на класс"
- msgstr "отделить ваше представление от вашей базы данных, контроллера, домена".
- не пишите спагетти однородный одиночный кодовый блок, но пишите много отдельных модульных компонентов, которые работают вместе
Речь идет о способе и стиле кода, который в настоящее время - в течение этого десятилетия - рассматривается и поддерживается в большинстве структур, пропагандируется на конвенциях, передаваемых через сообщество. Это сдвиг в мышлении от «монолитных блоков» к «микросервисам». И с этим приходит цена с точки зрения производительности и накладных расходов на уровне машины, а также некоторых накладных расходов на уровне программиста.
Исходный вопрос следует:
В области компьютерных наук я заметил заметный сдвиг в мышлении, когда речь заходит о программировании. Я часто сталкиваюсь с советом, который звучит так:
- написать меньший функциональный код (более тестируемый и обслуживаемый таким образом)
- реорганизовать существующий код в меньшие и меньшие куски кода, пока большинство ваших методов / функций не займет всего несколько строк, и станет ясно, какова их цель (которая создает больше функций по сравнению с большим монолитным блоком)
- написать функции, которые выполняют только одно - разделение задач и т. д. (которые обычно создают больше функций и больше кадров в стеке)
- создавать больше файлов (один класс на файл, больше классов для целей декомпозиции, для целей слоя, таких как MVC, архитектура домена, шаблоны проектирования, OO и т. д., что создает больше вызовов файловой системы)
Это изменение по сравнению со «старыми», «устаревшими» или «спагетти» методами кодирования, когда у вас есть методы, охватывающие 2500 строк, а большие классы и объекты бога делают все.
У меня вопрос такой:
когда вызов сводится к машинному коду, к 1 и 0, к инструкциям по сборке, к пластинам жесткого диска, должен ли я вообще быть обеспокоен тем, что мой совершенно разнесенный по классам ОО-код с множеством переработанных мелких и маленьких функций тоже генерирует много лишних накладных расходов?
Детали
Хотя я не очень хорошо знаком с тем, как в конце концов ASO-код и его вызовы обрабатываются в ASM, и как вызовы DB и вызовы компилятора преобразуются в перемещение рычага привода на жестком диске, у меня есть некоторые идеи. Я предполагаю, что каждый дополнительный вызов функции, вызов объекта или вызов "#include" (в некоторых языках) генерируют дополнительный набор инструкций, тем самым увеличивая объем кода и добавляя различные накладные расходы "связывания кода", без добавления фактического "полезного" кода , Я также полагаю, что хорошая оптимизация может быть сделана для ASM до того, как он будет фактически запущен на оборудовании, но эта оптимизация может сделать слишком много.
Следовательно, мой вопрос - сколько накладных расходов (в пространстве и скорости) делает хорошо разделенный код (код, разбитый на сотни файлов, классов и шаблонов проектирования и т. Д.), По сравнению с наличием «одного большого метода, который содержит все в одном монолитном файле ", из-за этого накладные расходы?
ОБНОВЛЕНИЕ для ясности:
Я предполагаю, что взятие одного и того же кода и его разбиение, рефакторинг, разделение его на все больше и больше функций и объектов, а также методов и классов приведет к все большему количеству передачи параметров между меньшими частями кода. Потому что, конечно, рефакторинг кода должен поддерживать поток, а это требует передачи параметров. Другие способы или более классов или более фабричные методы шаблонов проектирования, приводит к более накладных прохождения различных битов информации больше , чем это имеет место в одной монолитной класса или метода.
Где-то было сказано (цитата TBD), что до 70% всего кода составлено из инструкции ASM MOV - загрузка регистров ЦП с соответствующими переменными, а не фактические выполняемые вычисления. В моем случае вы загружаете процессорное время инструкциями PUSH / POP, чтобы обеспечить связь и передачу параметров между различными частями кода. Чем меньше вы делаете свои куски кода, тем больше накладных расходов требуется. Я обеспокоен тем, что эта связь увеличивает раздувание и замедление работы программного обеспечения, и мне интересно, стоит ли мне беспокоиться об этом и насколько сильно, если вообще нужно, потому что нынешнее и будущие поколения программистов, которые создают программное обеспечение для следующего столетия , придется жить и использовать программное обеспечение, созданное с использованием этих методов.
ОБНОВЛЕНИЕ: несколько файлов
Сейчас я пишу новый код, который медленно заменяет старый код. В частности, я заметил, что одним из старых классов был файл из ~ 3000 строк (как упоминалось ранее). Теперь он становится набором из 15-20 файлов, расположенных в разных каталогах, включая тестовые файлы и не включая PHP-фреймворк, который я использую, чтобы связать некоторые вещи вместе. Также появятся и другие файлы. Когда дело доходит до дискового ввода-вывода, загрузка нескольких файлов происходит медленнее, чем загрузка одного большого файла. Конечно, загружаются не все файлы, они загружаются по мере необходимости, и существуют опции кэширования на диске и памяти, но, тем не менее, я считаю, что это loading multiple files
требует больше обработки, чем loading a single file
памяти. Я добавляю это к моей проблеме.
ОБНОВЛЕНИЕ: Зависимость Внедрить все
Возвращаясь к этому через некоторое время ... Я думаю, что мой вопрос был неправильно понят. Или, возможно, я решил неправильно понять некоторые ответы. Я говорю не о микрооптимизации, поскольку некоторые ответы выделены (по крайней мере, я думаю, что называть то, что я говорю о микрооптимизации, является неправильным), а о движении «кода рефакторинга для ослабления тесной связи» в целом на каждом уровне кода. Я пришел из Zend Con совсем недавно, где этот стиль кода был одним из ключевых пунктов и центральных элементов конвенции. Отсоедините логику от представления, от представления модели, модели от базы данных и, если можете, отсоедините данные от базы данных. Dependency-Inject все, что иногда означает просто добавление кода проводки (функции, классы, шаблон), который ничего не делает, но служит точкой шва / крючка, в большинстве случаев легко удваивая размер кода.
ОБНОВЛЕНИЕ 2. Влияет ли «разделение кода на несколько файлов» на производительность (на всех уровнях вычислений)
Как compartmentalize your code into multiple files
влияет философия сегодняшних вычислений (производительность, использование диска, управление памятью, задачи обработки процессора)?
Я говорю о
До...
В гипотетическом, но вполне реальном, не столь далеком прошлом, вы могли бы легко написать один моноблок файла, который имеет модель и представление и спагетти контроллера или не-спагетти-кодирован, но который запускает все, как только он уже загружен. Выполняя некоторые тесты в прошлом с использованием кода на языке C, я обнаружил, что загружать один файл объемом 900 МБ в память и обрабатывать его большими кусками НАМНОГО быстрее, чем загружать кучу файлов меньшего размера и обрабатывать их с меньшими затратами времени. куски делают ту же самую работу в конце.
.. И сейчас*
Сегодня я смотрю на код, который показывает бухгалтерскую книгу, которая имеет такие особенности, как ... если элемент представляет собой «порядок», показывает блок HTML «показать порядок». Если можно скопировать элемент строки, распечатайте блок HTML, который отображает значок и параметры HTML, позволяющие сделать копию. Если элемент можно переместить вверх или вниз, отобразите соответствующие стрелки HTML. И т.д. могу, через Zend Framework создатьpartial()
звонки, что по сути означает «вызов функции, которая берет ваши параметры и вставляет их в отдельный HTML-файл, который он также вызывает». В зависимости от того, насколько подробно я хочу получить, я могу создать отдельные функции HTML для самых маленьких частей бухгалтерской книги. Один для стрелка вверх, стрелка вниз, один для «я могу скопировать этот элемент» и т. Д. Легко создавать несколько файлов только для отображения небольшой части веб-страницы. Взяв мой код и закулисный код Zend Framework, система / стек, вероятно, вызывает около 20-30 различных файлов.
Какая?
Меня интересуют аспекты, связанные с износом машины, которая создается путем разделения кода на множество небольших файлов.
Например, загрузка большего количества файлов означает, что они находятся в разных местах файловой системы и в разных местах физического жесткого диска, что означает увеличение времени поиска и чтения жесткого диска.
Для процессора это, вероятно, означает больше переключения контекста и загрузки различных регистров.
В этом подблоке (обновление № 2) меня интересует более строго то, как использование нескольких файлов для выполнения одних и тех же задач, которые могут быть выполнены в одном файле, влияет на производительность системы.
Использование Zend Form API против простого HTML
Я использовал Zend Form API с последними и лучшими современными методами OO, чтобы создать HTML-форму с проверкой, трансформируясь POST
в доменные объекты.
Мне потребовалось 35 файлов, чтобы сделать это.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
Все они могут быть заменены несколькими простыми файлами HTML + PHP + JS + CSS, возможно, всего 4 облегченными файлами.
Это лучше? Стоит ли? ... Представьте, что вы загружаете 35 файлов + многочисленные файлы библиотеки Zend Zramework, которые заставляют их работать, против 4 простых файлов.