2008-11-27 27 views
22

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

+0

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

+0

Câu hỏi này khá rộng. –

Trả lời

33

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?

+4

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. –

+2

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

+1

Đó 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. –