2009-05-13 44 views
6

Quy tắc của ngón tay cái là không thể vượt qua các cấu trúc nhỏ theo giá trị và những cái lớn hơn nên được làm con trỏ.Các cấu trúc lớn có thể được truyền bằng giá trị hiệu quả như thế nào?

Câu hỏi của tôi chính xác là điểm cắt này ở đâu? Làm thế nào lớn có thể các cấu trúc được trước khi bạn tốt hơn hết đi qua chúng bằng con trỏ.

Tôi biết điều này sẽ khác nhau giữa các nền tảng, nhưng tôi cho rằng một số ước tính sơ bộ có thể được đưa ra. Một hoặc hai năm trước, tôi đã cố gắng tìm hiểu điều này trên kiến ​​trúc PPC và tôi ngạc nhiên rằng người ta có thể truyền khá nhiều dữ liệu một cách hiệu quả theo giá trị. Hãy suy nghĩ 10 giá trị gấp đôi hoặc như vậy là tốt vì số lượng lớn các thanh ghi trong PPC. Bởi con trỏ thực sự liên quan đến việc sao chép nhiều hơn trong và ngoài bộ nhớ.

Tuy nhiên bây giờ tôi đang ở trên intel và tôi hy vọng mọi thứ có thể khác nhau. Kể từ khi CPU không có nhiều đăng ký theo truyền thống, nhưng có lẽ đó là khác nhau trên 64bit hoặc đăng ký điểm nổi?

+4

Nó phụ thuộc .... Bạn cần chuẩn ... –

+1

Mitch là chính xác, cách duy nhất để biết là điểm chuẩn. Và câu trả lời của bạn sẽ khác nhau tùy thuộc vào nền tảng bạn thử nghiệm. –

+0

Tôi đoán vấn đề của tôi là tôi không biết làm thế nào để băng ghế dự bị đánh dấu nó đúng cách. Tôi lo ngại rằng một ví dụ đơn giản sẽ dễ dàng được tối ưu hóa bởi trình biên dịch và không phản ánh việc sử dụng thực tế. Nó có vẻ ngu ngốc để làm tối ưu hóa sớm, nhưng đây là một cái gì đó tôi đã đấu tranh với việc có hiệu suất tốt trên vì vậy tôi không muốn làm cho sự lựa chọn ngu ngốc không cần thiết. Nó sẽ ảnh hưởng đến toàn bộ thiết kế API của tôi, vì vậy tôi không muốn phải thay đổi tất cả điều này sau này. –

Trả lời

1

OK, vì vậy tôi đã cố gắng làm theo lời khuyên và lập hồ sơ mã của tôi bằng cách sử dụng con trỏ và giá trị. Tôi cũng đã xem mã lắp ráp. Dường như các đặc tính hiệu năng trên x86 khá khác với PPC. Trên PPC giao diện nhị phân tới C xác định rằng đối số sẽ được đặt vào sổ đăng ký (có quá nhiều thứ để chọn), tuy nhiên có vẻ như ngay cả trên 64bit x86 cũng yêu cầu đối số được đặt trên ngăn xếp.

Vì vậy, điều đó giải thích tại sao x86 truyền qua con trỏ luôn có vẻ nhanh hơn. Tuy nhiên tôi nhận thấy trình biên dịch là rất mong muốn nội tuyến. Vì vậy, nó không quan trọng trong cách mà tôi đã làm nó. Vì vậy, tôi đoán kết luận là sử dụng bất cứ điều gì đi qua đó là thuận tiện cho bạn.

Tôi nghĩ rằng ưu đãi vượt qua theo giá trị, bởi vì làm việc trên các bản sao của các giá trị có phần an toàn hơn. Trường hợp thử nghiệm của tôi là một cấu trúc bao gồm 4 đôi (vì vậy tôi đoán rằng làm cho nó 32 byte trên hầu hết các nền tảng).

4

Nếu bạn tìm kiếm trên web, bạn sẽ tìm thấy một số nguyên tắc về kích thước byte để truyền theo tham chiếu và giá trị. Tôi sẽ tin tưởng khá nhiều không ai trong số đó. Cách duy nhất để biết rằng một cấu trúc đặc biệt là một vấn đề là để

hồ sơ Nó

Đây là cách duy nhất để biết 100% rằng có một vấn đề.

Trước khi người chăn nuôi nhảy vào. Có một số trường hợp rõ ràng ngoài kia. Tôi sẽ không ví dụ bao giờ vượt qua một struct theo giá trị nếu nó đã nói 100 thành viên. Nhưng đó không phải là vấn đề hiệu suất, nó sẽ là nhiều hơn cho các vấn đề không gian ngăn xếp.

+0

Downvote. Đây không phải là câu trả lời - đừng bảo mọi người tìm kiếm trên web. Đăng sự thật và tham khảo chúng. –

0

Đừng bỏ qua phần liên kết phát trong thử nghiệm của bạn. Nếu bạn đang trôi nổi hoặc tăng gấp đôi xung quanh và cấu trúc của bạn không được căn chỉnh trên các ranh giới thích hợp, bộ vi xử lý có thể sẽ tìm nạp một phần giá trị của bạn, chuyển nó, sau đó ORING phần còn lại trước khi lưu trữ nó. Tôi nghĩ rằng hầu hết các trình biên dịch hiện đại sẽ DTRT (bằng cách căn chỉnh cấu trúc khi nó được khai báo), nhưng nếu bạn đang tối ưu hóa cho không gian thì điều này có thể sẽ là một vấn đề.

Hmmm, bây giờ mà tôi nghĩ về nó, thực hiện việc này với một hạt muối, như tôi đã không thực hiện bất kỳ mã hóa ở mức độ thấp trên vòm x86 từ Pentium Pro ...

0

Một số trình biên dịch có thể thực hiện xác định kích thước tối ưu cho bạn. Nếu tôi nhớ chính xác, trình biên dịch TI28xx sẽ tự động chuyển đổi giá trị truyền theo giá trị để chuyển qua tham chiếu nếu cấu trúc ở trên một kích thước nhất định.

2

Trong C++, quy tắc để vượt qua mọi thứ không có trong danh sách sau là tham chiếu const vì hiệu suất cơ bản không bao giờ tồi tệ hơn. Danh sách các trường hợp ngoại lệ là:

loại
  • tiểu học (int vv),
  • con trỏ,
  • loại trống (loại thẻ),
  • loại chức năng giống như (functors), và
  • vòng lặp.

Tôi không chắc chắn nếu điều này có thể được áp dụng trực tiếp cho C (ngoài các loại rõ ràng mà C không có) nhưng có thể một hướng dẫn tương tự được áp dụng.

+0

Tôi làm theo mẫu này khi lập trình C++, nhưng nói đúng, tôi không chắc chắn rằng nó luôn tối ưu. Theo như tôi biết const MyClass & var, được thực hiện như con trỏ const. Và đối với các đối tượng nhỏ (ví dụ: nói 2-3 đôi) đi qua con trỏ chậm hơn so với truyền theo giá trị. –

+0

Truy cập vào các con trỏ tất nhiên phải chịu phí nhưng các nhà sản xuất bộ xử lý nhận thức được sự cần thiết của con trỏ. Như vậy, họ có biện pháp phòng ngừa. Hướng dẫn tối ưu hóa AMD ví dụ về sự giải thích cho phép sử dụng con trỏ ở đây vì bộ vi xử lý được phát triển với cách sử dụng như vậy trong tâm trí. Dài truyện ngắn: ngay cả đối với các cấu trúc nhỏ, con trỏ cũng có thể nhanh hơn giá trị truyền qua. Nội tuyến có thể thay đổi hành vi này thêm nữa. –

+0

Có bất kỳ nguồn "chính thức" nào trong danh sách ngoại lệ bạn đã đăng không? Tôi đã viết một câu hỏi thời tiết nó có ý nghĩa để vượt qua các loại tiểu học bằng cách tham khảo. –

-1

Thông thường các loại nguyên thủy tôi chuyển giá trị, mọi thứ khác theo tham chiếu. Đó là quy tắc của tôi về ngón cái.

+4

Câu hỏi về hiệu suất, không phải về quy tắc của bạn. – stepancheg

Các vấn đề liên quan