2011-07-26 14 views
11

Trong 10 hoặc thậm chí 5 năm sẽ không có [Edit2: máy chủ hoặc máy tính để bàn] CPU 32 bit.Tôi có nên sử dụng 'dài' thay vì 'int' trên 64 bit trong lang với kích thước loại cố định (như Java, C#)

Vì vậy, có lợi thế nào khi sử dụng int (32bit) trên long (64bit) không?
Và có bất kỳ nhược điểm nào khi sử dụng int không?


Edit:

  1. By 10 or 5 years Tôi có nghĩa là trên đại đa số những nơi mà những langs được sử dụng

  2. Tôi có nghĩa là loại sử dụng theo mặc định. Ngày nay tôi thậm chí sẽ không bận tâm để nghĩ rằng nếu tôi nên sử dụng short làm bộ đếm chu kỳ, chỉ cần for(int i.... Cùng một cách long quầy đã giành được

  3. sổ đăng ký đã 64 bit, không có lợi ích nào trong các loại 32 bit. Và tôi nghĩ rằng một số mất trong 8 loại bit (bạn phải hoạt động trên nhiều bit hơn sau đó bạn đang sử dụng)

+5

Re: câu đầu tiên: '[trích dẫn cần thiết]'. –

+0

@Matt: Tôi có nghĩa là 'gần như' và' trên phần lớn những nơi mà những lang được sử dụng'. Tôi nghĩ đó không phải là một vấn đề lớn và ngụ ý. Và điều đó sẽ làm cho câu hỏi dài hơn nhiều mà không có nhiều lợi ích. Tôi có nên chỉnh sửa không? Nếu 'có', vui lòng đề xuất cách viết - Tôi không giỏi tiếng Anh –

+1

Xem nhận xét trước. Nhưng có. Sử dụng loại mô tả tốt nhất miền - ví dụ: tại sao một 'long' được sử dụng để lưu trữ" ngày trong năm "? –

Trả lời

5

Nếu bạn đang sử dụng bộ xử lý 64 bit và đã biên dịch mã cho 64 bit, thì ít nhất một thời gian, long có thể hiệu quả hơn vì nó khớp với kích thước đăng ký. Nhưng liệu điều đó có thực sự tác động đến chương trình của bạn nhiều hay không là gây tranh cãi. Ngoài ra, nếu bạn đang sử dụng long trên tất cả các địa điểm, bạn thường sẽ sử dụng nhiều bộ nhớ hơn - cả trên ngăn xếp và trên heap - điều này có thể tác động tiêu cực đến hiệu suất. Có quá nhiều biến để biết chắc chắn chương trình của bạn sẽ hoạt động tốt như thế nào bằng cách sử dụng long theo mặc định thay vì int. Có những lý do tại sao nó có thể nhanh hơn và lý do tại sao nó có thể chậm hơn. Nó có thể là một rửa tổng số.

Điều điển hình cần làm là chỉ sử dụng int nếu bạn không quan tâm đến kích thước của số nguyên. Nếu bạn cần số nguyên 64 bit, thì bạn sử dụng long. Nếu bạn đang cố gắng sử dụng ít bộ nhớ và int nhiều hơn mức bạn cần, thì bạn sử dụng byte hoặc short.

x86_64 CPU sẽ được thiết kế để có hiệu quả trong việc xử lý các chương trình 32 bit và do đó không giống như việc sử dụng int sẽ làm suy giảm nghiêm trọng hiệu suất. Một số điều sẽ nhanh hơn do căn chỉnh tốt hơn khi bạn sử dụng số nguyên 64 bit trên CPU 64 bit, nhưng những thứ khác sẽ chậm hơn do yêu cầu bộ nhớ tăng lên. Và có lẽ có nhiều yếu tố khác liên quan đến việc chắc chắn có thể ảnh hưởng đến hiệu suất theo một trong hai hướng.

Nếu bạn thực sự muốn biết điều gì sẽ làm tốt hơn cho ứng dụng cụ thể trong môi trường cụ thể của bạn, bạn sẽ cần phải cấu hình nó. Đây không phải là một trường hợp mà có một lợi thế rõ ràng của một trong những khác.

Cá nhân, tôi khuyên bạn nên đi theo tuyến đường điển hình khi sử dụng int khi bạn không quan tâm đến kích thước của số nguyên và sử dụng các loại khác khi thực hiện.

+0

Xem https://www.reddit.com/r/compsci/comments/3mss9b/any_idea_why_this_go_loop_is_faster_than_pure_c/cvj478g –

12

32-bit vẫn là một kiểu dữ liệu hoàn toàn hợp lệ; giống như chúng ta có 16-bit và byte vẫn còn xung quanh. Chúng tôi đã không ném số 16 bit hoặc 8 bit khi chúng tôi chuyển sang bộ xử lý 32 bit. Số 32 bit là một nửa kích thước của số nguyên 64 bit về mặt lưu trữ. Nếu tôi đã mô hình hóa một cơ sở dữ liệu, và tôi biết giá trị không thể cao hơn những gì một số nguyên 32 bit có thể lưu trữ; Tôi sẽ sử dụng một số nguyên 32 bit cho mục đích lưu trữ. Tôi cũng làm điều tương tự với số 16 bit. Số 64 bit cũng chiếm nhiều không gian hơn trong bộ nhớ; mặc dù không phải bất cứ điều gì đáng kể cho máy tính xách tay cá nhân ngày nay có thể gửi với 8 GB bộ nhớ.

Không có bất lợi nào của int ngoài loại dữ liệu nhỏ hơn. Nó giống như yêu cầu, "Tôi nên lưu trữ đường của tôi ở đâu? Trong một bát đường, hoặc một silo?" Vâng, điều đó phụ thuộc hoàn toàn vào lượng đường bạn có.

Kiến trúc bộ xử lý không nên có nhiều việc phải làm với loại dữ liệu kích thước bạn sử dụng. Sử dụng những gì phù hợp. Khi chúng tôi có bộ xử lý 512 bit, chúng tôi vẫn sẽ có byte.

EDIT:

Để giải quyết một số ý kiến ​​/ chỉnh sửa ..

  1. Tôi không chắc chắn về "Sẽ không có CPU máy tính để bàn 32-bit". ARM hiện là 32 bit; và có ; cho bây giờ. Điều đó không phù hợp với "Desktop" trong mô tả của bạn; nhưng tôi cũng nghĩ trong vòng 5-10 năm, cảnh quan của loại thiết bị chúng tôi viết phần mềm cũng sẽ thay đổi đáng kể. Máy tính bảng không thể bỏ qua; mọi người sẽ muốn các ứng dụng C# và Java chạy trên chúng, xem xét Microsoft đã chính thức chuyển Windows 8 sang ARM.

  2. Nếu bạn muốn bắt đầu sử dụng long; đi trước. Không có lý do gì để không. Nếu chúng ta chỉ nhìn vào CPU (bỏ qua kích thước lưu trữ), và đưa ra các giả định chúng ta đang ở trên một kiến ​​trúc x86-64, thì nó không tạo ra nhiều khác biệt.

  3. Giả sử rằng chúng tôi đang gắn bó với kiến ​​trúc x86; điều đó cũng đúng. Bạn có thể kết thúc với một ngăn xếp lớn hơn một chút; tùy thuộc vào bất kỳ khung bạn đang sử dụng.

+0

+1 cho điều này. Tôi chắc chắn có thể tìm hiểu thêm về chủ đề này (và tôi hoan nghênh bất kỳ và tất cả các ý kiến ​​sửa chữa, vì họ là sư phạm) nhưng tôi nghĩ rằng OP có lẽ sẽ ổn khi các kích thước là sức mạnh của hai. Trong năm hoặc mười năm, bạn có thể viết lại ứng dụng đó (vì các lý do hoàn toàn riêng biệt) ...: P –

+1

** 1. ** Ý tôi là "theo mặc định". Ngày nay tôi thậm chí sẽ không bận tâm nghĩ rằng nếu tôi nên sử dụng 'short' làm bộ đếm chu kỳ, chỉ là' for (int i ... '. Cách tương tự trong các quầy' long' đã thắng (xem điểm tiếp theo) ** 2 ** Tôi không nói về lưu trữ DB - nó có một chút khác biệt.Trong khi thực thi Java hoặc C# vars (int hoặc long) được lưu trữ trên thanh ghi và vì các thanh ghi đã rộng 64-bit, tôi không giành được gì bằng cách sử dụng int hoặc ngắn –

+0

@ Alexander, Bạn đang ở ngay trong đó hầu hết CPU là 64 bit những ngày này, nhưng điểm là nó chưa được TẤT CẢ CPU.Nếu bạn sử dụng các biến dài trên một CPU 32 bit thì nó sẽ chậm hơn vì nó có để xử lý Vì vậy, nếu bạn không cần 64 bit giá trị của các giá trị sau đó bạn không đạt được nhiều bằng cách sử dụng lâu dài, và nếu ai đó với một máy 32 bit muốn chạy chương trình của bạn thì bạn có thể bị bất lợi (Cho dù họ có chú ý hay không là một vấn đề khác ...) – ChrisC

3

Xin lỗi vì câu trả lời của C++.

Nếu kích thước của vấn đề loại sử dụng một loại kích thước:

  • uint8_t
  • int32_t
  • int64_t
  • vv

Nếu kích thước không quan trọng sử dụng một loại biểu cảm:

  • size_t
  • ptrdiff_t
  • ssize_t
  • vv

Tôi biết rằng D có sized typessize_t. Tôi không chắc chắn về Java hay C#.

+1

Cộng một cho D-tham chiếu trong ngày –