Trong những trường hợp nào tôi nên mong đợi memcpys làm tốt hơn các bài tập trên phần cứng INTEL/AMD hiện đại? Tôi đang sử dụng GCC 4.2.x trên nền tảng Intel 32 bit (nhưng cũng quan tâm đến 64 bit).memcpy vs assignment trong C
Trả lời
Bạn sẽ không bao giờ mong đợi chúng hoạt động tốt hơn. Lý do là, trình biên dịch sẽ sử dụng memcpy anyway khi nó nghĩ rằng nó sẽ nhanh hơn (nếu bạn sử dụng tối ưu cờ). Nếu không và nếu cấu trúc là hợp lý nhỏ mà nó phù hợp với sổ đăng ký, thao tác đăng ký trực tiếp có thể được sử dụng mà sẽ không yêu cầu bất kỳ truy cập bộ nhớ nào cả.
GCC có các mẫu di chuyển khối đặc biệt trong nội bộ để tìm ra khi nào thay đổi trực tiếp thanh ghi/ô nhớ, hoặc khi nào sử dụng chức năng ghi nhớ. Lưu ý khi gán cấu trúc, trình biên dịch biết tại thời gian biên dịch như thế nào lớn di chuyển là có được, do đó, nó có thể unroll bản sao nhỏ (làm một di chuyển n-lần trong hàng thay vì looping) ví dụ. Lưu ý -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.
Ai biết tốt hơn khi sử dụng memcpy so với trình biên dịch?
Lưu ý rằng ngược lại có thể áp dụng - trong GCC ít nhất, memcpy của một kích thước nhỏ được thay thế bằng hướng dẫn sao chép, và nếu được sử dụng với một con trỏ đến một nguồn nhỏ và/hoặc đích * không * ngăn chặn một hoặc cả hai được tối ưu hóa sổ đăng ký. Vì vậy: làm bất kỳ kết quả nào trong mã đơn giản nhất. –
Bạn không nên mong đợi một để làm tốt hơn khác. Nếu bạn có vấn đề về hiệu suất, bạn nên cấu hình nó, xem liệu bài tập/memcpy có phải là vấn đề không, và nếu có, hãy thử thay đổi chúng để sử dụng phần còn lại và xem điều đó có thực hiện tốt hơn không. Nhiều hồ sơ hơn, ít phỏng đoán hơn. ;) – jalf
Đó là để nói, tôi sẽ mong đợi "nhiệm vụ sẽ tốt hơn memcpy" cũng là sai, cho rằng người hỏi đã chỉ định một GCC gần đây. Nhưng giả sử không có diễn viên là cần thiết, tôi đồng ý với lời khuyên của bạn để sử dụng chuyển nhượng, vì nó dẫn đến mã rõ ràng nhất. –
- 1. Delphi CopyMemory vs C++ memcpy
- 2. memcpy trong C#
- 3. C# initialiser assignment có điều kiện
- 4. C# memcpy tương đương
- 5. quy tắc C răng cưa và memcpy
- 6. Sự khác nhau giữa memset và memcpy trong C
- 7. Sao chép cấu trúc trong C với gán thay vì memcpy()
- 8. C - Malloc và memcpy (quản lý bộ nhớ)
- 9. memcpy với startIndex?
- 10. C++ memcpy từ mảng kép tới mảng float
- 11. Trong hàm vận hành gán, mảng là memcpy hoàn toàn
- 12. tránh với memcpy
- 13. memcpy không đồng bộ trong linux?
- 14. Int32 vs Int64 vs Int trong C#
- 15. Toán tử vs Hàm trong C/C++
- 16. Monitor vs Mutex trong C#
- 17. var vs Object trong C#
- 18. Tốt hơn hoặc giống nhau: CPU memcpy() vs device cudaMemcpy() trên pinned, bộ nhớ được ánh xạ trong CUDA?
- 19. Sự khác biệt giữa strncpy và memcpy?
- 20. static vs extern "C"/"C++"
- 21. CppCMS vs C++ Server Pages vs Wt
- 22. C# Assembly.Load vs Assembly.ReflectionOnlyLoad
- 23. C getchar vs scanf
- 24. C#: System.Object vs Generics
- 25. TerminateProcess vs Ctrl + C
- 26. Mảng Variable Sized vs calloc trong C
- 27. Chuyển nhượng vs Khởi tạo trong C++
- 28. biểu thức lambda trong C# vs. vb.net
- 29. C++ * vs & trong khai báo hàm
- 30. NULL vs nil trong Mục tiêu-C
Câu hỏi thú vị! Vì bạn rõ ràng lo lắng về cách cải thiện tốc độ hoạt động của bộ nhớ: Gần đây tôi đã đọc về vai trò của việc nén trong chuyển giao bộ nhớ từ một người nào đó phát triển các pyTables: http://www.pytables.org/docs/StarvingCPUs.pdf Như được mô tả ở đó, việc sử dụng memcpy thông thường có thể chậm so với những cải tiến của anh ta với máy nén rất nhanh ([blosc] (http://blosc.pytables.org/trac/)). Vui lòng lưu ý điều này chỉ dành cho nội dung hiệu suất cao! – math
Câu hỏi này khá rộng. –