2010-02-27 38 views
23

Tôi nhớ có đọc ở đâu đó rằng nó là tốt hơn (về mặt hiệu suất) để sử dụng Int32, ngay cả khi bạn chỉ yêu cầu Byte. Nó được áp dụng (được cho là) ​​chỉ trong trường hợp bạn không quan tâm đến việc lưu trữ. Điều này có hợp lệ không?Tôi có nên sử dụng byte hoặc int không?

Ví dụ: tôi cần một biến sẽ giữ một ngày trong tuần. Tôi

int dayOfWeek; 

hoặc

byte dayOfWeek; 

EDIT: Guys, tôi biết dayOfWeek enum. Câu hỏi là về cái gì khác.

+1

Đối với ví dụ _particular_ đó, tôi sẽ không sử dụng int _or_ a byte. Một enum sẽ tốt hơn trong trường hợp đó (2 nghĩa là gì? Thứ Ba? Thứ Hai?). Tôi biết bạn đang khái quát hóa, nhưng một số trường hợp cụ thể có thể được xử lý tốt hơn với một cái gì đó khác với một loại số nghiêm ngặt. –

+2

Theo như hiệu quả đi - bạn có thể không thực sự nói mà không có hồ sơ. Nếu bạn không định hình, bạn không tối ưu hóa. – kyoryu

Trả lời

18

Thường thì có, một số nguyên 32 bit sẽ hoạt động tốt hơn một chút vì nó đã được căn chỉnh đúng cho các chỉ lệnh CPU gốc. Bạn chỉ nên sử dụng loại số có kích thước nhỏ hơn khi bạn thực sự cần lưu trữ thứ gì đó có kích thước đó.

+2

Bởi "lưu trữ" bạn có nghĩa là lưu trữ trong cơ sở dữ liệu hoặc tập tin? – niaher

+1

Có. Hoặc nếu bạn đang tương tác với một ứng dụng gốc đang mong đợi một bit có kích thước byte dữ liệu. – MikeP

+1

Vâng, nó vẫn có thể là một lựa chọn tốt để sử dụng byte trên int nếu họ đang ở trong một mảng lớn mà là tiêu thụ quá nhiều bộ nhớ. – Ponkadoodle

2

System.DayOfWeek

MSDN

Hầu hết các int thời gian sử dụng. Không phải cho hiệu suất nhưng đơn giản.

+0

Vâng, tôi biết điều đó. Biến DayOfWeek chỉ là một ví dụ. – niaher

+1

@niaher - Hãy nhớ rằng những người lập trình là những người rất văn chương. – ChaosPandion

+1

Điều này đã upvotes? Bây giờ nó nói điều gì đó hoàn toàn khác. Ngự trị hỗn loạn. –

10

Bạn nên sử dụng DayOfWeek enum, trừ khi có lý do chính đáng không.

DayOfWeek day = DayOfWeek.Friday; 

Để giải thích, vì tôi đã được downvoted:

Các đúng đắn mã của bạn là hầu như luôn luôn quan trọng hơn so với hiệu suất , đặc biệt là trong trường hợp chúng ta đang nói này nhỏ nên sự khác biệt . Nếu sử dụng một enum hoặc một lớp đại diện cho ngữ nghĩa của dữ liệu (cho dù đó là DayOfWeek enum, hoặc enum khác, hoặc một Gallons hoặc Feet class) làm cho mã của bạn rõ ràng hơn hoặc dễ bảo trì hơn, nó sẽ giúp bạn đạt đến điểm mà bạn có thể tối ưu hóa một cách an toàn.

int z; 
int x = 3; 
int y = 4; 
z = x + y; 

Điều đó có thể biên dịch. Nhưng không có cách nào để biết nếu nó làm bất cứ điều gì lành mạnh hay không.

Gallons z; 
Gallons x = new Gallons(3); 
Feet y = new Feet(4); 
z = x + y; 

này sẽ không biên dịch, và thậm chí nhìn vào nó nó rõ ràng tại sao không - thêm Gallons để Feet chẳng có ý nghĩa.

+3

Bạn chưa nghe nói về đơn vị * gallon-feet * chưa? – ChaosPandion

+3

Có. Tôi tin rằng bạn sử dụng nó để đo khối lượng * Apple-Kumquats *. – kyoryu

+2

Đồng ý. Hiểu sai những gì một biến đại diện có thể tài khoản cho nhiều lỗi hơn bộ nhớ hoặc hạn chế không gian đĩa bao giờ làm! – Nij

2

Sử dụng int. Bộ nhớ máy tính được giải quyết bằng "từ", thường dài 4 byte. Điều này có nghĩa là nếu bạn muốn lấy một byte dữ liệu từ bộ nhớ, CPU phải truy xuất toàn bộ từ 4 byte từ RAM và sau đó thực hiện một số bước bổ sung để cô lập byte đơn mà bạn quan tâm. về hiệu suất, nó sẽ dễ dàng hơn nhiều cho CPU để lấy toàn bộ một từ và được thực hiện với nó.

Thực tế trong mọi thực tế, bạn sẽ không nhận thấy bất kỳ sự khác biệt nào giữa hai yếu tố liên quan đến hiệu năng (trừ trường hợp cực hiếm, cực đoan). Đó là lý do tại sao tôi thích sử dụng int thay vì byte, bởi vì bạn có thể lưu trữ số lớn hơn với khá nhiều không có hình phạt.

+0

Nếu hiệu suất không bị ảnh hưởng nhiều, thì tôi thích gắn bó với ngữ nghĩa và sử dụng byte nơi tôi chỉ cần một byte. Bằng cách này tôi có thể tránh được một số lỗi không mong muốn. – niaher

+2

Trên thực tế, CPU phải truy xuất toàn bộ dòng bộ nhớ cache từ RAM, sau đó là từ bốn byte từ bộ nhớ cache và sau đó là byte mong muốn – rpetrich

4

Vị trí mặc định của tôi là cố gắng sử dụng các loại mạnh để thêm các ràng buộc vào các giá trị - nơi bạn biết trước các giá trị đó.Như vậy trong ví dụ của bạn, có thể thích hợp hơn khi sử dụng byte dayOfWeek vì nó gần với phạm vi giá trị mong muốn của bạn hơn.

Đây là lý do của tôi; với ví dụ về lưu trữ và vượt qua một phần năm của một ngày. Phần năm - khi xem xét các phần khác của hệ thống bao gồm SQL Server DateTimes, bị giới hạn từ 1753 đến 9999 (lưu ý phạm vi có thể của C# cho DateTime là khác nhau!) Vì vậy, short bao gồm các giá trị có thể của tôi và nếu tôi cố gắng vượt qua bất kỳ điều gì lớn hơn trình biên dịch sẽ cảnh báo tôi trước khi mã sẽ biên dịch. Thật không may, trong ví dụ cụ thể này, thuộc tính C# DateTime.Year sẽ trả về một int - do đó buộc tôi phải truyền kết quả nếu tôi cần phải vượt qua ví dụ: DateTime.Now.Year vào chức năng của tôi.

Vị trí bắt đầu này được xem xét bởi lưu trữ dài hạn dữ liệu, giả sử 'hàng triệu hàng' và dung lượng đĩa - mặc dù giá rẻ (giá rẻ hơn nhiều khi bạn được lưu trữ và chạy SAN hoặc giống). Trong một ví dụ DB khác, tôi sẽ sử dụng các loại nhỏ hơn như byte (SQL Server tinyint) cho ID tra cứu, nơi tôi tự tin rằng sẽ không có nhiều kiểu tra cứu, thông qua từ lâu (SQL Server bigint) cho id ở đó có thể sẽ có nhiều hồ sơ hơn. tức là để bao gồm các hồ sơ giao dịch.

Vì vậy, quy tắc của tôi của ngón tay cái:

  1. Go cho đúng đắn đầu tiên nếu có thể. Sử dụng DayOfWeek trong ví dụ của bạn, tất nhiên :)
  2. Đi cho một loại kích thước thích hợp do đó làm cho việc sử dụng kiểm tra an toàn biên dịch cho bạn lỗi trong thời gian sớm nhất có thể;
  3. ... nhưng bù đắp với nhu cầu hiệu suất cực kỳ và đơn giản, đặc biệt là nơi lưu trữ lâu dài không được tham gia hoặc chúng tôi đang xem xét bảng tra cứu (số lượng hàng thấp) thay vì một giao dịch (số lượng hàng cao).

Vì lợi ích của sự rõ ràng, bộ nhớ DB có xu hướng không co lại nhanh như bạn mong đợi bằng cách thu hẹp các loại cột từ bigint thành các loại nhỏ hơn. Điều này là do việc đệm vào các ranh giới từ và các vấn đề kích thước trang bên trong DB. Tuy nhiên, bạn có thể lưu trữ tất cả các mục dữ liệu nhiều lần trong DB của bạn, có lẽ thông qua lưu trữ hồ sơ lịch sử khi chúng thay đổi, và cũng giữ vài ngày cuối cùng của sao lưu và sao lưu đăng nhập. Vì vậy, tiết kiệm một vài phần trăm nhu cầu lưu trữ của bạn sẽ có tiết kiệm dài hạn trong chi phí lưu trữ. Tôi chưa bao giờ gặp vấn đề cá nhân khi hiệu suất trong bộ nhớ của byte so với ints là một vấn đề, nhưng tôi đã lãng phí giờ và giờ phải tái phân bổ dung lượng đĩa và máy chủ sống hoàn toàn ngừng vì không có ai có sẵn để theo dõi và quản lý những thứ như vậy.

+0

+1 để thực sự sử dụng tính năng nhập mạnh mẽ. Lợi ích lớn nhất của việc gõ mạnh là * không * IntelliSense! – kyoryu

0

Về số lượng lưu trữ, hãy sử dụng byte và về hiệu suất CPU, sử dụng int.

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