2009-10-19 14 views
10

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

+0

Czy statycznie łączących w czasie wykonywania? Wtedy na pewno jest to środowisko wykonawcze, które dodaje __ najwyższy_ narzut. – dirkgently

+0

Brak wystarczającej ilości informacji, aby uzyskać sensowną odpowiedź. Wszystko, co dostarczy, będzie czystą spekulacją. –

+0

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. –

Odpowiedz

13

Może twój kod zawiera dużo wskazówek.

The Free Lunch Is Over

....

(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ść.)

+2

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. –

+0

To bardzo interesujące, dziękuję za publikację –

2

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%.

3

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)

+0

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). –

Powiązane problemy