2012-05-20 56 views
7

Tôi đang lập trình một trò chơi và muốn đại diện cho một bảng bằng cách sử dụng một mảng. Tôi đang tìm kiếm hiệu quả vì tôi sẽ lặp lại nhiều lần. Trong trường hợp này, cả mảng int hoặc mảng char có vẻ thuận tiện cho việc biểu diễn bảng. Có bất kỳ sự khác biệt về hiệu quả khi làm các hoạt động trong một mảng int và một mảng char?Hiệu quả: mảng char vs int mảng

Tôi nghi ngờ rằng vì mọi phần tử của mảng char có kích thước 1 byte, nó có thể chậm hơn do biểu diễn khác nhau trong bộ nhớ (xem xét một máy tính hiện đại có ít nhất 32 bit để biểu diễn int) ... đúng?

Xin cảm ơn trước.

EDIT: Tôi sẽ tạo ra cây trò chơi, đó là lý do tại sao hiệu quả là rất quan trọng và sự khác biệt nhỏ trong thời gian tiêu thụ có thể tạo sự khác biệt rất lớn.

+0

Tôi không thể nghĩ ra bất kỳ lý do nào 'char' sẽ chậm hơn. Nếu có, có thể tùy thuộc vào những gì bạn đang làm, nó có thể nhanh hơn. Trên các mục tiêu được nhúng với kiến ​​trúc 8 bit, các hoạt động 'int' sẽ chậm hơn. – jedwards

+0

Có thể, nhưng mảng 'char' chiếm ít bộ nhớ hơn, có thể làm cho nó nhanh hơn mảng' int', nếu nó có đủ phần tử. –

Trả lời

5

Đối với CPU/s nào?

Một số CPU không thể truy cập trực tiếp vào bất kỳ thứ gì nhỏ hơn "thứ gì đó" và trình biên dịch cần tạo chuỗi hướng dẫn "tải, dịch chuyển và mặt nạ" để truy cập từng byte riêng lẻ. Sử dụng int sẽ giành chiến thắng cho trường hợp này.

Một số CPU có thể truy cập byte mà không gặp sự cố. Trong trường hợp này (nếu đủ dữ liệu có liên quan đến nó quan trọng) vấn đề có khả năng là kích thước bộ đệm và/hoặc băng thông bộ nhớ; và (ít nhất là cho 80x86) tôi mong đợi char sẽ giành chiến thắng đơn giản chỉ vì nhiều dữ liệu được đóng gói vào mỗi dòng bộ nhớ cache.

Thuật toán/s nào?

Nếu bạn có thể ném SIMD vào đó, char có khả năng thắng. Ví dụ, với 128-bit SIMD bạn có thể xử lý 16 byte cho mỗi lệnh hoặc 4 (32-bit) số nguyên cho mỗi lệnh và char có thể nhanh hơn 4 lần vì điều này một mình.

Lời khuyên tốt nhất là nên sử dụng một cái gì đó như:

#ifdef USE_INT 
    typedef int thingy 
#else 
    typedef unsigned char thingy 
#endif 

Sau đó, bạn có thể cấu hình nó và thay đổi nó bất cứ khi nào bạn muốn.

+0

+1, nhưng bạn đã nhận được 'typedef' của vòng sai. –

+0

Heh - thật đáng xấu hổ - đã được khắc phục ngay bây giờ. Cảm ơn :-) – Brendan

4

char s thường là liên kết 1 byte và int s thường được căn chỉnh 4 byte. Giả sử bạn đang làm việc với một máy theo tiêu chuẩn này, cả hai mảng sẽ lưu trữ nội dung của chúng dưới dạng khối liên tiếp của bộ nhớ (mảng int là 4x kích thước của mảng char). Vì vậy, không chắc là một trong hai sẽ khác nhau về cách họ sử dụng một đoạn bộ nhớ được cấp phát.

Điều đó đang được nói, ngay cả khi biểu diễn bộ nhớ cơ bản là khác nhau, tôi nghi ngờ nó sẽ ảnh hưởng đến thông lượng của chương trình của bạn.

+0

Tôi đồng ý với câu đầu tiên, nhưng điều này không ngụ ý rằng biểu diễn int (trên máy 32 bit) sẽ lấy 4x bộ nhớ? Có, các khối sẽ tiếp giáp, nhưng không cùng kích thước. – jedwards

+0

Tôi đã cập nhật câu trả lời của mình để làm rõ điểm này (tôi cho rằng người đọc sẽ nhận được điều này, nhưng có lẽ tôi nên rõ ràng hơn). –

+0

Tôi nghĩ rằng câu mà đã cho tôi là "nó không chắc rằng một trong hai sẽ có bất kỳ khác nhau về tổng số sử dụng bộ nhớ." - Điều khoản sử dụng bộ nhớ tổng thể, chúng sẽ khác nhau, một 4x kích thước của bộ nhớ khác. – jedwards

3

Hãy thử và xem. Sử dụng cờ -S để gcc để lấy mã bộ mã hóa:

gcc -Wall -S code.c -o code.s 

Xem có sự khác biệt rõ ràng về độ dài của mã được tạo không. Đây không nhất thiết là toàn bộ câu chuyện khi bạn cần hiểu người lắp ráp để đánh giá sự khác biệt. Nhưng nó có thể cung cấp cho bạn một gợi ý - có lẽ là int và char sẽ được nhiều như nhau.

Lưu ý rằng nếu bạn trộn các loại, bạn gần như chắc chắn sẽ nhận được mã hơi chậm hơn với mảng char. Vì vậy, nếu bạn lưu trữ dữ liệu trong mảng char và sau đó 'xử lý' bằng cách nào đó bằng cách sử dụng các loại int bạn có thể sẽ nhận được một hướng dẫn bổ sung mỗi khi một chuyển đổi được thực hiện giữa hai. Dùng thử với -S.

+0

+1! Đó sẽ là bằng chứng rõ ràng xác nhận các xác nhận. Cả hai câu trả lời tuyệt vời, đó là một sự xấu hổ tôi chỉ có thể chọn một. – PALEN