Dart: оператор распространения для конструктора

Я работаю с 2008 года в библиотеке, которая сильно использует метапрограммирование шаблонов. Существует реальная потребность в лучших инструментах или подходах для понимания того, что потребляет наибольшее время компиляции.

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

Кстати, просто разделение одного и того же кода на большее, более мелкие файлы могут ускорить его компиляцию. Я не просто говорю о возможности параллельной компиляции - даже в серийном режиме, я заметил, что она все еще быстрее. Я наблюдал этот эффект в gcc как при компиляции моей библиотеки, так и при компиляции парсеров Boost Spirit. Моя теория заключается в том, что некоторая часть разрешения символа, разрешения перегрузки, SFINAE или кода ввода типа в gcc имеет сложность O (n log n) или даже O (n ^ 2) в отношении количества определений типов или символов в игре в исполнительном блоке.

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

1
задан Giraldi 7 March 2019 в 10:37
поделиться