Страницы

Поиск по вопросам

четверг, 7 марта 2019 г.

Можно ли компилировать только используемый код?

Допустим есть class подключенный к проекту, в котором записаны все основные функции, которые я использую для построения приложений. Я просто вызываю нужную мне функцию, в нужный момент. Их в классе много. Вопрос заключается в том, что можно ли сделать так, чтобы компилятор компилил в приложение только те функции, которые вызывались из класса, а не весь класс? Заранее спасибо.


Ответ

Это нельзя сделать стандартными средствами компилятора. Можно сделать при помощи утилит, называемых обфускаторами - они, кроме запутывания кода, обычно умеют вырезать неиспользуемый код.
В мелких проектах это просто не имеет практического смысла - вы просто не можете написать достаточное количество кода, чтобы он значительно повлиял на размер результирующей сборки.
В крупных проектах такой подход сомнителен по некоторым причинам:
нельзя вырезать public методы - они могут вызываться из других сборок. нельзя вырезать реализации интерфейсов - для для таких методов не будет прямых вызовов в коде. нельзя вырезать вирутальные методы т.к. они всега вызываются неявно. вырезание может поломать вызов методов через reflection - опять же, из-за возможности вызова метода "по имени".
Крупный проект обычно подразумевает Interface Segregation (много интерфейсов) и использованием IOC/DI - вызов всего через интерфейсы, а не напрямую. Т.о. почти все методы становятся невырезаемыми или публичными, явно или неявно.
Т.е. безопасно из крупного проекта можно вырезать пару процентов кода, не больше. Никто не будет рисковать ради пары килобайт.
Кроме того, "неиспользуемый" код никак не влияет на производительность. Он просто лежит в виде пачки данных (IL) на диске на диске. В реальный (машинный) код методы преобразуется при первом вызове метода. Нет вызова - нет преобразования, нет затрат.

Комментариев нет:

Отправить комментарий