Mam projekt VC++ (2005), który generuje zarówno biblioteki 32-bitowe, jak i 64-bitowe. 32-bitowa biblioteka dll ma 1044 KB, podczas gdy wersja 64-bitowa ma 1620 KB. Ciekawi mnie, dlaczego rozmiar jest tak duży. Czy to tylko ze względu na większy rozmiar adresu, czy też istnieje opcja kompilatora, której mi brakuje?Rozmiar 64-bitowego dll 50% większy niż 32-bitowy
Odpowiedz
Może twój kod zawiera dużo wskazówek.
....
(Na marginesie: Oto anegdota wykazać „przestrzeń jest prędkość”, który niedawno hit mojego zespołu kompilatora Kompilator używa samej bazy źródłowej. dla 64-bitowych kompilatorów 32-bitowych i , kod jest po prostu skompilowany jako proces 32-bitowy lub , 64-bitowy 1. 64-bitowy kompilator uzyskał eal z podstawowej wydajności przez uruchomienie na 64-bitowym CPU, głównie dlatego, że 64-bitowy CPU miał wiele więcej rejestrów do pracy zi miał inne funkcje wydajności kodu . Wszystko dobrze i dobrze. Ale co z danymi o ? Idąc do 64 bitów nie zmienić rozmiar większość danych w pamięci, chyba że oczywiście wskaźniki w szczególności były już dwukrotnie większy były wcześniej. Jak to się dzieje, nasza kompilator używa wskazówek znacznie więcej mocno w swoich wewnętrznych danych konstrukcje niż większość innych rodzajów aplikacji kiedykolwiek będzie. Ponieważ wskaźniki były teraz 8 bajtami zamiast 4 bajtów, wzrost czystego rozmiaru danych, my zauważyliśmy znaczny wzrost 64-bitowego zestawu roboczego kompilatora . Ten większy zestaw roboczy spowodował karę wykonania w wysokości , która niemalże dokładnie zrekompensowała wzrost wydajności osiągnięty dzięki zwiększeniu wydajności, który uzyskaliśmy dzięki , przechodzącemu do szybszego procesora z większą liczbą rejestrów . W chwili pisania tego opisu kompilator 64-bitowy działa z taką samą szybkością, jak jako kompilator 32-bitowy, nawet , chociaż podstawa źródłowa jest taka sama dla , a procesor 64-bitowy oferuje lepszą nieprzetworzoną wydajność przetwarzania. Przestrzeń jest prędkość.)
Należy zauważyć, że ten fragment mówi o rozmiarze danych, a nie o kodzie. Ale myślę, że wyniki i przyczyny będą podobne dla kodu i danych. –
To bardzo interesujące, dziękuję za publikację –
Twój rozmiar wskaźnika podwoiła się, więc jeśli masz dużo wskazówek w kodzie, plik wykonywalny łatwo mogą rosnąć o 50%.
x86-64 ma więcej rejestrów. W rezultacie opcodes potrzebują więcej bitów, aby je określić. Ponadto, zgodnie z tradycją x86, możesz określić części rejestru, a teraz masz 32-bitowy rejestr częściowy. Instrukcje, które nie używają rejestrów, są rzadkością, więc zmiana dotyczy niemal każdej instrukcji. Ponieważ x86-64 nadal jest ISA o zmiennej długości CISC, nie oznacza to, że każda instrukcja wzrosła z 32 do 64 bitów, ale istnieje wyraźny wzrost.
Kolejną zmianą jest to, że movq
, opcode ustawić rejestr do stałej wymaga 64-bitowych stałych (ale inne stałe w opcodes nadal są 32 bity)
Dodatkowo, każda instrukcja, która uzyskuje dostęp do jednego z rozszerzonych rejestrów (r8-r15 lub xmm8-xmm15) musi używać prefiksu REX, który dodaje dodatkowe 4 bity do rozmiaru każdej instrukcji. Nie ma znaczenia, czy są to operacje 64-bitowe, czy nie; na przykład addl% eax,% ebx będzie o 4 bity krótszy niż addl% eax,% r8d. (Kompilatory powinny wziąć to pod uwagę i używać rejestrów podających krótszy rozmiar kodu, jeśli to możliwe, ale nie wiem dokładnie, czy Visual C to robi). –
- 1. MongoDB: rozmiar wyniku zapytania większy niż rozmiar kolekcji
- 2. Bitmapa skompresowana z jakością = 100 większy rozmiar pliku niż oryginał
- 3. Dlaczego kompilacja z Crashlytics ma rozmiar większy niż plik .ipa?
- 4. Lucene.Net większy niż/mniej niż TermRangeQuery?
- 5. Jak wyszukuję większy niż symbol?
- 6. MySQL Query, wybierz większy niż
- 7. Postgres: Datownik większy niż teraz
- 8. Odata: Filtr "Większy niż data"
- 9. JavaScript nie większy niż 0
- 10. JSF weryfikator większy niż zero
- 11. CSS - margines górny 50% to więcej niż 50%
- 12. Rozmiar aktualizacji aplikacji na iOS jest znacznie większy niż rozmiar aplikacji.
- 13. Zmieniając rozmiar paska wyszukiwania programowo, ale nie mogę uzyskać kciuka, aby był większy niż pasek
- 14. Wyświetlanie zdjęć na 50% swojej „rodzimej” rozmiar
- 15. Powiadomienia na pulpicie Chrome - większy rozmiar
- 16. Codeigniter Rekord aktywny: większy niż instrukcja
- 17. czas użytkownika większy niż w czasie rzeczywistym
- 18. Minimalna Subarray który jest większy niż Key
- 19. SQL COUNT * GROUP BY większy niż
- 20. sprawdzić, czy ciąg zawiera numer większy niż
- 21. Perl: "Kwantyfikator {{}} większy niż 32766 w regex"
- 22. Błąd mysqldump: Dostałem pakiet większy niż max_allowed_packet '
- 23. Wydajność: większy/mniejszy niż vs nie równa
- 24. czas użytkownika mclapply większy niż minął czas
- 25. Dlaczego 1 nie jest większy niż -0x80000000
- 26. C# typ pamięci większy niż ulong
- 27. Czas dat PHP większy niż dzisiaj
- 28. Angularjs: większy niż filtr z powtórzeniem ng
- 29. SQL Server 2005: Indeks większy niż dane przechowywane
- 30. Czy rozmiar DLL ma znaczenie?
Czy statycznie łączących w czasie wykonywania? Wtedy na pewno jest to środowisko wykonawcze, które dodaje __ najwyższy_ narzut. – dirkgently
Brak wystarczającej ilości informacji, aby uzyskać sensowną odpowiedź. Wszystko, co dostarczy, będzie czystą spekulacją. –
Anegdotycznie rozmiar kodu x64 zwiększa się o 50% do 66% w stosunku do równoważnego kodu x86. Zakładałem, że wzrost był głównie spowodowany wielkością wskaźników (w tym adresów docelowych wywołań funkcji). Jednak nie widziałem żadnego rygorystycznego badania/analizy; Myślę, że zdecydowanie byłoby to interesujące - mam nadzieję, że ktoś napisze wskaźnik. –