2012-04-17 19 views
34

Mam bibliotekę zajęć i używam tylko jej części. Czy istnieje potrzeba usunięcia tego, co nie jest używane, aby zmniejszyć rozmiar tworzonego kodu (w konfiguracji wydania)?Czy tylko kompilator skompiluje kod, który może zostać wykonany?

O ile widziałem, kompilator się tym zajmuje, a usunięcie kodu nie zmienia rozmiaru pliku EXE. Czy to zawsze będzie prawda? Usunięcie całego niepotrzebnego kodu zajęłoby bardzo dużo czasu, więc chcę wiedzieć, czy jest to potrzebne.

Więcej informacji: istnieją metody i klasy w bibliotece klas, które nie są wywoływane z kodu wykonującego, ale są przywoływane przez inne części kodu w bibliotece klas (które same nie są wywoływane).

+3

Zawsze można złapać reflektor .NET i zobaczyć, co jest zawarte w "wydany" DLL. Najlepszym sposobem nauki jest eksperymentowanie (przynajmniej takie było moje doświadczenie). –

+3

Czy kompilator będzie w stanie stwierdzić, że nigdy nie rozpowszechnisz tej biblioteki DLL dla kogoś, kto może spróbować użyć tego kodu? –

+1

@AnthonyPegram Biblioteka nie jest kompilowana osobno. Mam kod źródłowy w moim projekcie. – ispiro

Odpowiedz

34

Nie, kompilator również zawiera "martwy" kod. Prostym tego powodem jest to, że nie zawsze można dokładnie określić, jaki kod zostanie wykonany i nie zostanie wykonany. Na przykład nawet metoda prywatna, która nigdy nie jest przywoływana, może być wywoływana poprzez odbicie, a publiczne metody mogą być przywoływane przez zewnętrzne złożenia.

Możesz użyć narzędzia, które pomoże Ci znaleźć i usunąć nieużywane metody (w tym te wywoływane tylko przez inne, nieużywane metody). Wypróbuj What tools and techniques do you use to find dead code? i Find unused code, aby zacząć.

0

Wątpię, aby kompilator usunął cokolwiek. Faktem jest, że kompilator nie może stwierdzić, co jest używane, a co nie, ponieważ typy można tworzyć instancjami i metody wywoływane po imieniu, dzięki refleksji.

6

Wszystko zostaje skompilowane. Bez względu na to, czy jest on wywoływany, czy nie. Kod może zostać wywołany przez bibliotekę zewnętrzną.

Jedynym sposobem na zignorowanie kodu kompilatora jest użycie dyrektyw Preprocessor Compiler. Więcej informacji na temat tych here.

+0

Może być wywoływana tylko przez bibliotekę zewnętrzną, jeśli jest publiczna lub chroniona przez członka klasy publicznej. –

0

Załóżmy, że istnieje biblioteka klas o nazwie Utility. Utworzono nowy projekt i dodano bibliotekę klasy do tego projektu. Nawet jeśli twój EXE wywołuje tylko 1-2 metody z biblioteki klas, nigdy nie jest dobrym pomysłem, aby usunąć kod bez odwołań.

Byłoby to sprzeczne z zasadą ponownego użycia. Pomimo tego, że niektóre klasy będą obecne w bibliotece bez żadnych odniesień do EXE, nie będzie to miało żadnego negatywnego wpływu na wydajność lub rozmiar programu.

0

Ustalenie martwego kodu jest (jeśli czyni się idealizację, że ma się "świat matematyki" jak język) rekurencyjnie nierozstrzygalnym, w większości języków. (Kilka rzadkich, takich jak język Blaise są rozstrzygalne.)

Powiązane problemy