Gdy używam MSYS do kompilacji, etap ./configure
może trwać dłużej niż make
. Jednak ten sam proces w Linuksie ma szybką konfigurację i powolny make. Czy to po prostu jakieś ustawienie w MSYS, które pogrąża mój system? Czy ktoś ma rozwiązanie?Dlaczego konfiguracja jest tak powolna w MSYS?
Odpowiedz
Typowe configure
skrypty zrobić dużo rozpoczynania małych podprocesów. W systemach operacyjnych typu Unix odbywa się to za pomocą wywołań funkcji fork()
i exec()
, które mają bardzo szczególną semantykę, która musi zostać zachowana (na przykład, pamięć współużytkowana do zapisu po zapisie). W systemie Windows podprocesy są tworzone przy pomocy CreateProcess()
, która ma bardzo różną semantykę (np. Całkowicie oddzielne miejsce w pamięci od obiektu nadrzędnego). Aby poprawnie wykonywać skrypty i programy typu Unix, MSYS musi wykonać wiele prac emulacyjnych, aby tworzenie nowych procesów w systemie Windows działało jak na Unixie pod numerem fork()/exec()
. To kończy się wolniej niż system operacyjny, który oferuje te funkcje natywnie.
Możesz również wyłączyć wszystkie skanery antywirusowe. Będą ponownie skanować plik wykonywalny za każdym razem, gdy zostanie załadowany, co całkowicie zabija działanie skryptu.
Nawet jeśli nie masz uruchomionego antywirusa, nie zapomnij o programie Windows Defender. (Możesz także wyłączyć Kontrolę konta użytkownika, ale nie wiem, jaki wpływ miało to na czas ładowania programu.)
Wymagany jest duży dostęp do dysku, co powoduje znaczne spowolnienie pracy IMHO. Na przykład configure tworzy tymczasowy kod źródłowy, który ma zostać skompilowany w ramach testów, które wykonuje. Spowoduje to utworzenie pliku obiektu, który musi zostać usunięty ponownie. Co zrobić, aby przyspieszyć konfigurację, to wypakuj źródło, które chcę zbudować na dysku RAM, i skonfiguruj i skompiluj je tam. Polecam korzystanie z ImDisk (http://www.ltr-data.se/opencode.html/#ImDisk), które jest bezpłatne.
To naprawdę nie jest tak źle dla 'CreateProcess' w systemie Windows. Myślę, że cygwin próbuje naśladować widelec w oknach, co sprawia, że jest niesamowicie wolny. Jeśli bash nie używa fork (przypuszczam, że używa fork, ale nie sprawdziłem), aby uruchomić procesy, to konfiguracja będzie działać równie szybko. W moim pudełku i7, kiedy próbowałem naprawić ten "problem", okazało się, że cygwin może rozwidniać się tylko kilka razy na sekundę. Sposób testowania prędkości fork: while (true); do daty; zrobione | uniq -c – Pavel
+1 Pavel .. uclinux miał taki sam problem, że mógł działać bez MMU i wszystko z rozwidleniem używane bardzo powolny pełny egzemplarz – user1496062