Kamil K.

Kamil K. lubie placki

Temat: Mój minitest 32 vs 64

Aplikacja 2000 linii w c++. Tworząca sporo obiektów. Wyniki mnie troszkę zdziwiły.

Mam dwie hipotezy:

1. Kod skompilowany pod 64bit jest zauważalnie szybszy
2. Kod 32bit jest wykonywany wyraźnie wolniej w systemie 64bit. (wersja 32 i 64 korzystają z nieco innych bibliotek)

Która hipoteza jest prawdziwa?


$ ldd a-32.out
linux-gate.so.1 => (0xf7f49000)
libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7e30000)
libm.so.6 => /lib32/libm.so.6 (0xf7e0c000)
libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7de0000)
libc.so.6 => /lib32/libc.so.6 (0xf7c8b000)
/lib/ld-linux.so.2 (0xf7f4a000)
$ ldd a-64.out
linux-vdso.so.1 => (0x00007fff8adff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f8a9ecfa000)
libm.so.6 => /lib/libm.so.6 (0x00007f8a9ea77000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f8a9e85d000)
libc.so.6 => /lib/libc.so.6 (0x00007f8a9e50c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8a9f00a000)



$ time ./a-32.out<br />
real 0m6.639s<br />
user 0m6.636s<br />
sys 0m0.008s<br />
$ time ./a-64.out<br />
real 0m3.610s<br />
user 0m3.608s<br />
sys 0m0.000s<br />
Kamil K. edytował(a) ten post dnia 13.10.09 o godzinie 10:56
Stanisław P.

Stanisław P. Software designer

Temat: Mój minitest 32 vs 64

Kamil K.:
Aplikacja 2000 linii w c++. Tworząca sporo obiektów. Wyniki mnie troszkę zdziwiły.

To nie jest wystarczający opis aplikacji ;)

Przez co 32 będzie wolniejsze (64 szybsze):
- dużo operacji na wartościach 64 bitowych
- wielowątkowość + atomowe operacje na 64 bitowych
- długie funkcje które nie muszą dużo danych wyrzucać z rejestrów

Przez co 64 będzie wolniejsze (32 szybsze):
- ilość pamięci użytej na pointery - pointery są 2 razy dłuższe, więc masz 2 razy więcej danych do zapisania
- efektywnie mniej dostępnego L1/2 cache'u - dłuższe zmienne zabiorą go więcej

Różne aplikacje będą miały różne wyniki i tyle. Po opisie w jednej linii nie zidentyfikujesz jak się aplikacja będzie zachowywać.
Kamil K.

Kamil K. lubie placki

Temat: Mój minitest 32 vs 64

Stanisław Pitucha:
Kamil K.:
Aplikacja 2000 linii w c++. Tworząca sporo obiektów. Wyniki mnie troszkę zdziwiły.

To nie jest wystarczający opis aplikacji ;)

Aplikacja nie ma wątków. Tworzy i usuwa dynamicznie około 500 000 obiektów, które przerzuca pomiędzy kolekcjami. Wykonuje też obliczenia na typach int i double. A więc powinna być wolniejsza, a nie jest.
Jarosław P.

Jarosław P. IT, JBG-2 Sp. z o.o.

Temat: Mój minitest 32 vs 64

[...]
Aplikacja nie ma wątków. Tworzy i usuwa dynamicznie około 500 000 obiektów, które przerzuca pomiędzy kolekcjami. Wykonuje też obliczenia na typach int i double. A więc powinna być wolniejsza, a nie jest.
W trybie 64bitowym masz 2x więcej rejestrów ogólnego przeznaczenia,
dochodzi do tego SSE2 w standardzie, więc kompilator mógł to uwzględnić
przy optymalizacji kodu. W trybie 32bitowym domyślne ustawienia kompilatora
mogą nie uwzględniać SSE2+.

Aplikacja 32bitowa w 64bitowym systemie nie jest natywna, pewnie wystąpią
jakieś straty na przełączaniu trybów. Wypadało by przetestować na 32bitowym OS.

Konstrukcja obecnych procesorów / pamięci zapewne też preferuje kod 64bitowy.

Inna sprawa ile razy przeprowadziłeś test.
Kamil K.

Kamil K. lubie placki

Temat: Mój minitest 32 vs 64

Jarosław P.:
[...]
Aplikacja nie ma wątków. Tworzy i usuwa dynamicznie około 500 000 obiektów, które przerzuca pomiędzy kolekcjami. Wykonuje też obliczenia na typach int i double. A więc powinna być wolniejsza, a nie jest.
W trybie 64bitowym masz 2x więcej rejestrów ogólnego przeznaczenia,
dochodzi do tego SSE2 w standardzie, więc kompilator mógł to uwzględnić
przy optymalizacji kodu. W trybie 32bitowym domyślne ustawienia kompilatora
mogą nie uwzględniać SSE2+.


Ustawiłem przełącznik -mtune=core2 nie wpłynęło na wynik. Dla pewności skręciłem częstotliwość pracy procka na minimum.

Aplikacja 32bitowa w 64bitowym systemie nie jest natywna, pewnie wystąpią
jakieś straty na przełączaniu trybów. Wypadało by przetestować na 32bitowym OS.

Niestety nie mam 32 bitowego Linuksa pod ręką. Ale przy okazji popróbuję.
Inna sprawa ile razy przeprowadziłeś test.

Wyniki testu są jak najbardziej powtarzalne.
Stanisław P.

Stanisław P. Software designer

Temat: Mój minitest 32 vs 64

Ale można to przecież zrobić wszystko poprawnie, zamiast bawić się w zgadywanie. Kamil - jeśli jesteś naprawdę ciekawy z czego taka rozbieżność wynika, to profiler w dłoń i do dzieła ;)
Porównaj zebrane profile (tylko pełne, nie te wygenerowane przez losowe próbkowanie). Jeśli gdzieś są duże różnice, to podziel to miejsce na mniejsze fragmenty (funkcje) aż zlokalizujesz co konkretnie działa wolniej. Potem skompiluj do poziomu asemblera wersje 32b i 64b i zobacz czym się te funkcje konkretnie różnią.

Możesz jeszcze sprawdzić valgrindem (tool=cachegrind), jeśli chcesz potwierdzić tezę o ilości rejestrów.Stanisław Pitucha edytował(a) ten post dnia 15.10.09 o godzinie 23:59

Temat: Mój minitest 32 vs 64

Oraz tak jak napisali poprzednicy, testuj 32 bitowe binarki na natywnych 32 bitach ;]



Wyślij zaproszenie do