Pierwsza stabilna wersja narzędzia do tworzenia form opracowanego przez firmę LLVM lld

Rui Ueyama, autor linkera LLVM lld i kompilatora chibicc, przedstawił pierwszą stabilną wersję nowego, wysokowydajnego linkera Mold, który wyraźnie wyprzedza linkery GNU gold i LLVM lld pod względem szybkości łączenia plików obiektowych. Projekt jest uważany za gotowy do wdrożeń produkcyjnych i może być używany jako szybszy i przejrzysty zamiennik konsolidatora GNU w systemach Linux. Plany dotyczące następnej dużej wersji obejmują przygotowanie wsparcia dla platformy macOS, po czym rozpoczną się prace nad przystosowaniem Mold dla Windows.

Mold jest napisany w C++ (C++20) i rozpowszechniany na licencji AGPLv3, która jest zgodna z GPLv3, ale nie jest zgodna z GPLv2, ponieważ wymaga otwierania zmian podczas opracowywania usług sieciowych. Wybór ten podyktowany jest chęcią pozyskania środków na rozwój – autor jest skłonny sprzedać prawa do kodu w celu relicencjonowania na licencji permisywnej, takiej jak MIT, lub udostępnić osobną licencję komercyjną tym, którzy nie są zadowoleni z AGPL.

Mold obsługuje wszystkie funkcje konsolidatora GNU i jest bardzo szybki, łącząc tylko połowę szybkości zwykłego kopiowania plików za pomocą cp. Na przykład podczas budowania Chrome 96 (rozmiar kodu 1.89 GB) zbudowanie plików wykonywalnych c debuginfo na 8-rdzeniowym komputerze przy użyciu GNU gold zajmuje 53 sekundy, 11.7 sekundy dla LLVM lld i tylko 2.2 sekundy dla Mold (26 razy szybciej niż złoto GNU). Podczas łączenia Clang 13 (3.18 GB), GNU gold zajmuje 64 sekundy, LLVM lld zajmuje 5.8 sekundy, a Mold zajmuje 2.9 sekundy. Podczas łączenia Firefoksa 89 (1.64 GB) GNU gold zajmuje 32.9 sekundy, LLVM lld zajmuje 6.8 sekundy, a Mold zajmuje 1.4 sekundy.

Pierwsza stabilna wersja narzędzia do tworzenia form opracowanego przez firmę LLVM lld

Skrócenie czasu łącza może znacznie poprawić użyteczność tworzenia dużych projektów poprzez skrócenie czasu oczekiwania w procesie generowania plików wykonywalnych podczas debugowania i testowania zmian. Mold był motywowany irytacją związaną z koniecznością oczekiwania na zakończenie łączenia po każdej zmianie w kodzie, a także słabą wydajnością istniejących linkerów w systemach wielordzeniowych oraz chęcią wypróbowania zasadniczo innej architektury łączenia bez niepotrzebnego uciekania się do skomplikowane modele, takie jak łączenie przyrostowe.

Wysoką wydajność łączenia pliku wykonywalnego z dużej liczby plików obiektowych przygotowanych przez kompilator w Mold uzyskuje się dzięki zastosowaniu szybszych algorytmów, aktywnemu zrównoleglaniu operacji pomiędzy dostępnymi rdzeniami procesora oraz wykorzystaniu wydajniejszych struktur danych. Na przykład Mold implementuje technikę wykonywania intensywnych obliczeń jednocześnie z kopiowaniem plików, pobieraniem plików obiektowych z wyprzedzeniem do pamięci, używaniem szybkich tablic mieszających podczas rozwiązywania znaków, skanowaniem tabel relokacji w osobnym wątku i deduplikacją scalonych sekcji powtarzających się w różnych plikach.

Źródło: opennet.ru

Dodaj komentarz