W jakich okolicznościach należy się spodziewać, że memcpys przewyższy liczbę zadań na nowoczesnym sprzęcie INTEL/AMD? Korzystam z GCC 4.2.x na 32-bitowej platformie Intela (ale interesuje mnie również wersja 64-bitowa).memcpy vs cesja w C
Odpowiedz
Nigdy nie należy oczekiwać, że będą lepsze od przydziałów. Powodem jest to, że kompilator i tak będzie używał memcpy, gdy myśli, że byłoby to szybsze (jeśli użyjesz flag optymalizujących). Jeśli nie, a struktura jest rozsądnie mała, że pasuje do rejestrów, można zastosować bezpośrednią manipulację rejestrami, która w ogóle nie wymagałaby dostępu do pamięci.
GCC ma wewnętrznie wewnętrzne wzorce blokowe, które wymyślają, kiedy bezpośrednio zmieniać rejestry/komórki pamięci lub kiedy używać funkcji memcpy. Uwaga przy przypisywaniu struktury, kompilator wie, w czasie kompilacji, jak duży ruch będzie, więc może rozwinąć małe kopie (wykonaj ruch n-razy w wierszu zamiast pętli) na przykład. Uwaga -mno-memcpy
:
-mmemcpy
-mno-memcpy
Force (do not force) the use of "memcpy()" for non-trivial block moves.
The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.
Kto wie lepiej, gdy w użyciu memcpy niż sam kompilator?
Należy pamiętać, że można zastosować odwrotną stronę - przynajmniej w GCC, memcpy o małym stałym rozmiarze są zastępowane instrukcjami kopiowania, a jeśli używane ze wskaźnikiem do małego źródła i/lub miejsca docelowego nie * nie * uniemożliwiają jedno lub oba zoptymalizowane do rejestry. A więc: rób wszystko, co wynika z najprostszego kodu. –
Nie należy oczekiwać, że jeden będzie lepszy od drugiego. Jeśli masz problem z wydajnością, powinieneś go profilować, sprawdzić, czy przypisanie/memcpy to problem, a jeśli tak, spróbuj zmienić je, aby użyć drugiego, i sprawdź, czy to działa lepiej. Więcej profilowania, mniej zgadywania. ;) – jalf
Oznacza to, że spodziewam się, że "zadania będą lepsze od memcpy" także będzie fałszywe, biorąc pod uwagę, że ankietowany określił ostatnio GCC. Ale zakładając, że nie jest wymagana obsada, zgadzam się z twoją radą na wykorzystanie zadania, ponieważ daje to najwyraźniejszy kod. –
- 1. Delphi CopyMemory vs C++ memcpy
- 2. strcpy vs. memcpy
- 3. copy_to_user vs memcpy
- 4. Przypisanie struktury lub memcpy?
- 5. C++ memcpy to char * from c_str
- 6. ustawiania wartości domyślnych (cesja warunkowa)
- 7. Jaka jest różnica między memset i memcpy w C
- 8. Parallel cesja z nawiasami i ikona operatora
- 9. == vs Równe w C#
- 10. Int32 vs Int64 vs Int w C#
- 11. Jak zapobiec przepełnieniu bufora memcpy?
- 12. unikać reprezentacja pułapka z memcpy
- 13. Decompile C# vs C++
- 14. Boo vs C# vs Python?
- 15. Bardzo szybkie memcpy do przetwarzania obrazu?
- 16. Uzyskiwanie kompilacji GCC bez wstawiania wywołania memcpy
- 17. Przypisanie vs Inicjalizacja w C++
- 18. ! vs == nil w Objective-C
- 19. stdout vs console.write w C#
- 20. C vs C++ switch definicji zmiennej vs deklaracji
- 21. Czy istnieje standardowa, skrócona wersja memcpy?
- 22. Błąd pamięci podczas korzystania z memcpy?
- 23. C++ vs precyzją Python
- 24. UrlEncode - Javascript vs. C#
- 25. Co robi mój kompilator? (optymalizacja memcpy)
- 26. ctypes vs rozszerzenie C
- 27. C getchar vs scanf
- 28. Powershell vs C#
- 29. Stosując memcpy skopiować szereg elementów z tablicy
- 30. zbyt mało argumentów do funkcji „memcpy”
Interesujące pytanie! Ponieważ jesteś wyraźnie zaniepokojony, jak poprawić szybkość operacji pamięciowych: Ostatnio czytałem o roli kompresji w przenoszeniu pamięci od kogoś, kto opracował pyTables: http://www.pytables.org/docs/StarvingCPUs.pdf Jak już wspomniano, zwykłe użycie memcpy może być powolne w porównaniu do jego ulepszeń z bardzo szybkimi kompresorami ([blosc] (http://blosc.pytables.org/trac/)). Należy to uwzględnić tylko w przypadku produktów o wysokiej wydajności! – math
To pytanie jest dość szerokie. –