2012-01-26 24 views
5

Przekazuję kod C++ z systemu Linux do systemu Windows. W trakcie tego procesu okazało się, że następujący wiersz trwa ~ 10 razy wolniej pod Windows (na dokładnie tym samym sprzęcie):Windows vs. alokacja pamięci Linux/wydajność konstruktora std :: list

list<char*>* item = new list<char*>[160000]; 

W Windows trwa ~ 10ms, podczas gdy Linux zajmuje ~ 1ms. Zwróć uwagę, że jest to średni czas. Uruchomienie tego rzędu 100 razy zajmuje około 1 sekundy w systemie Windows.

Zdarza się to zarówno na win32, jak i na x64, obie wersje są kompilowane w Release, a prędkość jest mierzona za pomocą QueryPerformanceCounter (Windows) i gettimeofday (Linux).

Kompilator systemu Linux to gcc. Kompilatorem Windows jest VS2010.

Każdy pomysł, dlaczego tak się stało?

+3

Widzę, jak wznosi się fala ognia ... tak czy inaczej prawdopodobnie powinieneś robić rzeczy w pętli, więc te liczby prawdopodobnie nie mają znaczenia nawet 10ms jest łatwo zakłócane przez inne rzeczy. mierzyć w ciągu kilku sekund. Ale nawet wtedy zgaduję, że trudny sposób przydzielania pamięci w systemie Windows jest wolniejszy. Po prostu pobaw się trochę i spraw, by był bardziej podobny do wzoru, którego używałbyś w swoim programie. – PlasmaHH

+10

@EdHeal: naprawiliśmy maszynę czasu. możesz wrócić do 1998 roku i żyć tam szczęśliwie. –

+0

@ssg nie jestem pewien. Po mojej stronie starałem się jak najlepiej mieć timer o rozdzielczości 5ms w Qt i nie można tego zrobić w Windows. – UmNyobe

Odpowiedz

10

To może być bardziej kwestia implementacji biblioteki. Spodziewałbym się pojedynczego przydziału w większości przypadków, z domyślnym konstruktorem dla list nieprzydzielania niczego. Więc to, co próbujesz zmierzyć, to koszt domyślnego konstruktora z list (który jest wykonywany 160000).

Mówię "próbę zmierzenia", ponieważ pomiary o niewielkich rozmiarach są pomiar jittera zegara i rozdzielczości więcej niż wynoszą one czasy wykonania kodu . Powinieneś umieścić to w pętli, aby wykonać to na tyle często, aby uzyskać czas wykonywania kilku sekund. A kiedy to zrobisz, musisz podjąć środki ostrożności, aby zapewnić, że kompilator niczego nie zoptymalizuje.

A pod Linuksem, chcesz mierzyć używając przynajmniej clock(); ściana czas zegara, który otrzymujesz z gettimeofday jest bardzo zależny od tego, co jeszcze dzieje się w tym samym czasie. (Nie używaj jednak clock() pod Windows, jednak. Implementacja Windows jest zepsuta.)

+1

Zgadzam się, to jest pomiar kosztu konstruktora 'std :: list', a nie alokacji pamięci. Ponadto byłoby trywialnie zmierzyć te dwa osobno, używając alokacji, po której następuje * placement -'new [] '*. –

+0

Okazało się prawdą, lista <> ctor jest tam, gdzie większość czasu poszła. –

2

Myślę, że ta instrukcja zajmuje mniej czasu w obu systemach operacyjnych (bez względu na wszystko). W takim przypadku potrzeba tak niewiele czasu, aby mierzyć rozdzielczość timerów.

Powiązane problemy