Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы сократить затраты на сборку и затраты редактора, F# 11 совместно использует импортированные библиотеки и избегает повторного анализа. Измеряйте затронутую рабочую нагрузку, а не предполагайте повышение скорости выпуска или памяти.
Совместное использование импортированной двоичной библиотеки
FSharp.Compiler.Service может совместно использовать подходящие импортированные графы библиотеки между проектами, использующими те же двоичные зависимости.
FSharpChecker.Create отображает shareImportedAssemblies, включенный по умолчанию. Это позволяет избежать сохранения полного независимого импортированного графа для каждого проекта.
Для общего доступа требуется сопоставление разрешённых зависимостей и параметров импорта. Ссылки на проекты, поставщики типов, сборки с несколькими модулями и неоднозначные замыкания зависимостей исключаются. Импорты фреймворка уже использовались совместно.
PR с реализацией измерял сохраненную память после проверки и хранения всех проектов. Нагрузка ReSharper.FSharp из десяти проектов использовала 1547,2 МБ без этого совместного использования памяти и 1002,2 МБ с ним. Нагрузка при компиляции решения изменилась всего на 0,1%. Это эксперименты, связанные с изменением, а не универсальная экономия при обновлении. Перекрытие больших бинарных ссылок объясняет большую часть разницы.
Сохраненные метаданные в сравнении с временными выделениями
F# 11 сокращает сохраненные метаданные путем отложенного создания, небольших таблиц и повторного использования. Отдельно чтение метаданных и встроенная специализация выделяют меньше временных данных. Удерживаемая куча, объем выделения и память процесса — это разные метрики; не добавляйте результаты из этих перекрывающихся экспериментов.
Анализ редактора и навигация
Следующие улучшения применяются к разным уровням:
| Component | Работа предотвращена или ограничена |
|---|---|
| диагностика Visual Studio | Повторно использует диагностику для неизмененного документа с учетом версий текста и проекта, путей и параметров. Это нацелено на повторный анализ в период простоя, а не на произвольное использование устаревших результатов. |
| Visual Studio Найти все вхождения и переименовать | Ограничивает количество одновременных проверок типов, а не запуская отдельную проверку типов для каждого документа одновременно, сохраняя возможность отмены. |
| Поиск ссылок на внешние символы | Пропускает проекты, не ссылающиеся на двоичную сборку символа. |
| Инкрементный анализ FCS | Синхронизирует состояние построителя, чтобы перекрывающиеся запросы не создавали повторяющиеся цепочки анализа для того же изменения. |
Исправление Peek позволяет избежать взаимоблокировки навигации по метаданным. Используйте Go To Definition для созданных сигнатур метаданных; Peek ограничивается существующими документами. Для этих улучшений требуются обновленные компоненты editor/FCS, а не только основной пакет приложения.
Компиляция и одновременное выполнение задач сборки
Параллельная компиляция по умолчанию использует независимую обработку файлов и этапов компиляции в F# 11. Порядок в исходном коде остается частью языка; параллелизм не легализует опережающие зависимости.
Задачи сборки также используют среду MSBuild для отдельных задач и механизмы работы с путями вместо изменения глобального состояния процесса. Кэширование перегрузки уменьшает многократное разрешение, а компиляция защищённых паттернов позволяет избежать лавинообразного дублирования в некоторых сочетаниях дизъюнкций и гардов.
Сравните нужную метрику
- Для задержки сборки сравнивайте эквивалентные полные сборки с идентичными параметрами оптимизации, детерминированного вывода, ссылок и кэша. Используется
--parallelcompilation-для управляемого сравнения. - Для памяти для анализа удержания сохраняйте те же проекты активными и различайте управляемую память, объем выделения и память процесса.
- Для проверки отзывчивости воспроизводите действие в редакторе или нагрузку в режиме простоя. Выходные данные консольной программы не отражают работу редактора.