2013-10-25 6 views
5

Rozumiem, że różnica między memmove i polega na tym, że memmove obsługuje przypadek nakładania się pamięci. Sprawdziłem implementację w libgcc i dostałem ten artykuł [memcpy performance] ze strony internetowej intel.W jakiej platformie memmove i memcpy mogą mieć znaczną różnicę wydajności?

W bibliotece libgcc, memmove jest podobna do memcpy, obie mają tylko jeden bajt i bajt, więc wydajność powinna być prawie taka sama nawet po optymalizacji.

Ktoś zmierzył to i dostał ten artykuł memcopy, memmove, and Speed over Safety. Nawet nie sądzę, że memmove może być szybszy niż memcpy, ale nie powinno być dużej różnicy przynajmniej na platformie Intel.

Więc w jakiej platformie i jak memcpy może być znacznie szybciej niż memmove, jeśli nie ma, dlaczego zapewniając dwie podobne funkcje, a nie tylko memmove i prowadzić do wielu błędów.

Edytuj: Nie zadaję różnicy memmove i memcpy, wiem, że memmove może obsłużyć problem nakładania się. Chodzi o to, czy naprawdę istnieje platforma, w której memcpy jest szybszy niż memmove?

+0

Jeśli dobrze pamiętam istnieją pewne kwestie związane z nakładających pamięć adresów –

+2

Istnieje wiele pytań już na 'memcpy' vs.' memmove' (patrz pasek "Powiązane" po prawej). Czy jesteś pewien, że twoje pytanie nie jest już objęte jednym z nich? –

+0

Standardem jest ** nie ** o platformie Intela. –

Odpowiedz

3

Istnieje co najmniej jeden przypadek, w którym niedawno ograniczenie pamięci zakaz zachodzenia służy do generowania szybszy kod:

W Visual Studio memcpy może być skompilowany przy użyciu intrinsics, natomiast memmove nie może. Prowadzi to do tego, że memcpy jest znacznie szybszy dla małych regionów o znanym rozmiarze, ponieważ usunięto wywołanie funkcji i narzut konfiguracji. Implementacja z użyciem movsd// nie jest odpowiednia do nakładających się bloków, ponieważ rozpoczyna kopiowanie na najniższym adresie, zwiększając edi/esi podczas kopiowania.

Zobacz także Make compiler copy characters using movsd.

Memcpy GCC also lists zaimplementowane jako wbudowane, implementacja i motywacja prawdopodobnie będzie podobna do tej w Visual Studio.

+0

Ale dlaczego movsd/movsw/movsb nie nadaje się do kopiowania nakładki? Jeśli cały parametr jest znany, kompilator może również wybrać movsd lub movsw – ZijingWu

+0

ok Rozumiem. W większości przypadków rozmiar bloku jest stałą czasową kompilacji. – ZijingWu

+0

Instrukcje movsX zawsze przesuwają się w jednym kierunku, zaczynając od najniższego adresu i zwiększając edi/esi podczas kopiowania. D/W/B wybiera tylko jednostkę kopii (DWORD, WORD, BYTE). – Suma

0

Dobra praktyka: Ogólnie rzecz biorąc, UŻYWAJ memmove tylko, jeśli musisz. UŻYWAJ go, gdy istnieje bardzo uzasadniona szansa, że ​​regiony źródłowe i docelowe oblewają się.

W przeciwnym razie USE memcpy. memcpy jest bardziej wydajny.

referencyjny: https://www.youtube.com/watch?v=Yr1YnOVG-4g dr Jerry Cain (Stanford Intro Systems wykład - 7) Godzina: 36:00

Powiązane problemy