Какие стратегии Вы раньше улучшали время изготовления относительно крупных проектов?

Самое простое решение - просто указать team_id в схеме платежей (которая у вас уже есть).

Вам не нужны ни user_id, ни payment_id в схеме команды, чтобы получать платежи с командой. Вы можете просто получить сводный запрос с поиском в таблице платежей, чтобы получить команду вместе с оплатой.

Итак, учитывая, что у вас есть ID команд и вам нужны данные о командах вместе с данными о платежах, вы можете написать запрос агрегирования, что-то вроде этого,

             Team.aggregate([
            {
                $match: { _id: { $in: list_of_user_ids } } // this will get the teams which match the array of ids
            },
            {
                $lookup: // this will search data from a different collection
                {
                    from: 'payments', // the collection to search from
                    localField: '_id', // the matching field in the team collection
                    foreignField: 'team', // matching field in the payment colection
                    as: 'payment' the name you want to give to the resulting payment object
                }
            }
           ])

Редактировать 1: Поиск, который я написал, делает именно то, что вам нужно. Просто я предположил, что у вас есть массив идентификаторов пользователей. Если у вас один идентификатор пользователя, просто измените операцию сопоставления на написанную вами

           $match: { user_id:  currently_loggedin_userId } 
22
задан Adam Lear 19 December 2011 в 18:43
поделиться

20 ответов

  1. Форвардное объявление
  2. Идиома pimpl
  3. Предварительно скомпилированные заголовки
  4. Параллельная компиляция (например, надстройка MPCL для Visual Studio).
  5. Распределенная компиляция (например, Incredibuild для Visual Studio) .
  6. Инкрементальная сборка
  7. Разделите сборку на несколько «проектов», чтобы не компилировать весь код, если он не нужен.

[Позднее редактировать] 8. Покупайте более быстрые машины.

43
ответ дан 29 November 2019 в 03:22
поделиться

Это моя любимая мозоль, поэтому, даже если вы уже приняли превосходный ответ, я добавлю:

В C ++ это не столько язык как таковой, но модель сборки, предписанная языком, которая был великолепен еще в семидесятых, и библиотеки с тяжелыми заголовками.

Единственное, что не так в ответе Кэтэлина Питиха: «покупай быстрее машины» должно идти первым. Это самый простой способ с наименьшим воздействием.

Мое худшее было около 80 минут на устаревшей сборочной машине с VC6 на W2K Professional. Тот же самый проект (с тоннами нового кода) теперь занимает менее 6 минут на машине с 4-мя гиперпоточными ядрами, 8G RAM Win 7 x64 и приличными дисками. (Аналогичная машина, процессорная мощность которой примерно на 10,20% меньше, с 4G RAM и Vista x86 занимает вдвое больше времени)

Как ни странно, инкрементные сборки в большинстве случаев медленнее, чем полные перестройки.

1
ответ дан 29 November 2019 в 03:22
поделиться

В целом, большие проекты на C ++, над которыми я работал, имели медленное время сборки, были довольно грязными, с множеством взаимозависимостей, разбросанных по коду (те же самые файлы, используемые в большинстве cpps, толстые интерфейсы вместо тонких). В этих случаях медленное время сборки было лишь симптомом более серьезной проблемы, и при этом второстепенным симптомом. Рефакторинг для создания более понятных интерфейсов и разбивки кода на библиотеки улучшил архитектуру и время сборки. Когда вы создаете библиотеку, это заставляет вас думать о том, что является интерфейсом, а что нет, что на самом деле (по моему опыту) в конечном итоге улучшит базу кода. Если нет технической причины для разделения кода, некоторые программисты в ходе обслуживания просто выбросят что-нибудь в любой заголовочный файл.

1
ответ дан 29 November 2019 в 03:22
поделиться
  1. Минимизируйте ваш публичный API
  2. Минимизируйте встроенные функции в вашем API. (К сожалению, это также увеличивает требования к компоновщику).
  3. Максимизируйте предварительные декларации.
  4. Уменьшить связь между кодом. Например, передайте два целых числа в функцию для координат вместо вашего пользовательского класса Point, у которого есть собственный заголовочный файл.
  5. Используйте Incredibuild. Но иногда возникают некоторые проблемы.
  6. НЕ помещайте код, который экспортируется из двух разных модулей в тот же заголовочный файл.
  7. Используйте простую идиому. Упоминалось ранее, но стоит повторить.
  8. Используйте предварительно скомпилированные заголовки.
  9. Избегайте C ++ / CLI (т.е. управляемый c ++). Время компоновки также влияет.
  10. Избегайте использования глобального заголовочного файла, который включает в себя «все остальное» в вашем API.
  11. Не помещайте зависимость в файл lib, если ваш код на самом деле не нуждается в этом.
  12. Знайте разницу между включением файлов с кавычками и угловыми скобками.
2
ответ дан 29 November 2019 в 03:22
поделиться

ccache & amp; distcc (для проектов C / C ++) -

ccache кэширует скомпилированный вывод, используя предварительно обработанный файл в качестве «ключа» для поиска выходных данных. Это замечательно, потому что предварительная обработка довольно быстрая, и довольно часто изменения, которые вынуждают перекомпилировать, на самом деле не меняют источник для многих файлов. Кроме того, это действительно ускоряет полную перекомпиляцию. Также хорош тот случай, когда вы можете иметь общий кеш между членами команды. Это означает, что только первый парень, который получил последний код, на самом деле что-то компилирует.

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

3
ответ дан 29 November 2019 в 03:22
поделиться

Мощные машины компиляции и параллельные компиляторы. Мы также стараемся, чтобы полная сборка была как можно реже. Мы не меняем код, чтобы он компилировался быстрее.

Эффективность и правильность важнее скорости компиляции.

1
ответ дан 29 November 2019 в 03:22
поделиться
  1. Скопируйте флаги оптимизации компилятора,
  2. используйте опцию -j4 для gmake для параллельной компиляции (многоядерной или одноядерной)
  3. , если вы используете clearmake, используйте winking
  4. we может убрать флаги отладки .. в крайних случаях.
  5. Используйте несколько мощных серверов.
2
ответ дан 29 November 2019 в 03:22
поделиться

Лучшее предложение - создать make-файлы, которые действительно понимают зависимости и не перестраивают автоматически мир для небольшого изменения. Но если полная перестройка занимает 90 минут, а небольшая перестройка занимает 5-10 минут, велика вероятность, что ваша система сборки уже делает это.

Можно ли строить параллельно? Либо с несколькими ядрами, либо с несколькими серверами?

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

Ограничьте сборку одним «потоком», если применимо. «Полный продукт» может включать такие вещи, как отладочная версия или как 32-, так и 64-разрядные версии, или может включать файлы справки или страницы руководства, которые создаются / создаются каждый раз. Удаление компонентов, которые не нужны для разработки, может значительно сократить время сборки.

Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?

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

РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.

Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?

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

РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.

Содержит ли сборка продукт? Это действительно необходимо для разработки и тестирования? Включает ли сборка некоторые базовые тесты на работоспособность, которые можно пропустить?

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

РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.

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

РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.

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

РЕДАКТИРОВАТЬ: Использование локальной файловой системы в отличие от файловой системы, смонтированной по NFS, также может значительно сократить время сборки.

3
ответ дан 29 November 2019 в 03:22
поделиться
4
ответ дан 29 November 2019 в 03:22
поделиться

Сборки Unity

Incredibuild

Указатель на реализацию

форвардные объявления

, компилирующие "завершенные" разделы проекта в библиотеки DLL

3
ответ дан 29 November 2019 в 03:22
поделиться

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

15
ответ дан 29 November 2019 в 03:22
поделиться

В этой книге Крупномасштабное проектирование программного обеспечения C ++ есть очень полезные советы, которые я использовал в прошлых проектах.

2
ответ дан 29 November 2019 в 03:22
поделиться

Это список того, что мы сделали для разработки под Linux:

  • Как отметил Воин, используйте параллельные сборки (make -jN)
  • Мы используем распределенные сборки (в настоящее время icecream , который очень легко настроить), с этим у нас могут быть десятки или процессоры в данный момент. Это также имеет то преимущество, что дает сборки для наиболее мощных и менее загруженных машин.
  • Мы используем ccache, чтобы при выполнении make clean вам не приходилось действительно перекомпилировать исходные коды, которые не изменились, это скопировано из кеша.
  • Обратите внимание также, что отладочные сборки обычно компилируются быстрее, поскольку компилятору не нужно выполнять оптимизацию.
1
ответ дан 29 November 2019 в 03:22
поделиться

Мы однажды пытались создать прокси-классы.

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

1
ответ дан 29 November 2019 в 03:22
поделиться
  1. Многоядерная компиляция. Очень быстро с 8 ядрами, компилируемыми на I7.
  2. Инкрементное связывание
  3. Внешние константы
  4. Удалены встроенные методы в классах C ++.

Последние два позволили нам сократить время связывания с 12 минут до 1-2 минут. Обратите внимание, что это необходимо только в том случае, если объекты хорошо видны, т. Е. Видны «повсюду» и если существует много различных констант и классов.

Ура

4
ответ дан 29 November 2019 в 03:22
поделиться

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

0
ответ дан 29 November 2019 в 03:22
поделиться

В Visual Studio вы можете указать количество проектов для компиляции за раз. Его значение по умолчанию - 2, при увеличении которого время сокращается.

Это поможет, если вы не хотите связываться с кодом.

1
ответ дан 29 November 2019 в 03:22
поделиться

Одна уловка, которая иногда помогает, - это включить все в один файл .cpp. Поскольку включения обрабатываются один раз для каждого файла, это может сэкономить вам много времени. (Обратной стороной этого является то, что компилятор не может распараллеливать компиляцию)

Вы должны иметь возможность указать, что несколько файлов .cpp должны компилироваться параллельно (-j с make в Linux, / MP в MSVC - MSVC также имеет возможность компилировать несколько проектов параллельно. Это отдельные параметры, и нет причин, по которым вы не должны использовать оба)

В том же духе распределенные сборки (например, Incredibuild) могут помочь загрузка одной системы.

SSD-диски должны быть большим выигрышем, хотя я сам этого не тестировал (но сборка C ++ затрагивает огромное количество файлов, что может быстро стать узким местом).

Предварительно скомпилированные заголовки тоже могут помочь при осторожном использовании. (Они также могут навредить вам, если их придется перекомпилировать слишком часто.)

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

Но да, вы правы, это во многом вопрос языка. Я не знаю другого языка, который так сильно страдает от этой проблемы. Большинство языков имеют модульную систему, которая позволяет им исключать файлы заголовков, что имеет огромное значение. C имеет файлы заголовков, но это настолько простой язык, что время компиляции все еще управляемо. C ++ получает худшее из обоих миров.

7
ответ дан 29 November 2019 в 03:22
поделиться

Кэтэлин Питиш рассказал много хорошего. Другие, которые мы делаем:

  • Имеем инструмент, который генерирует уменьшенные файлы Visual Studio .sln для людей, работающих в определенной подобласти очень большого общего проекта.
  • Кэшируйте библиотеки DLL и PDB с момента их создания на CI для распространения. на машинах разработчика
  • Для CI, убедитесь, что связующая машина, в частности, имеет много памяти и высокопроизводительные диски
  • Храните некоторые дорогостоящие в регенерации файлы в системе управления версиями, даже если они могут быть созданы как часть сборка
  • Замените проверку Visual Studio того, что необходимо повторно связать нашим собственным скриптом, адаптированным к нашим обстоятельствам
1
ответ дан 29 November 2019 в 03:22
поделиться

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

0
ответ дан 29 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

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