7

Tôi đã xem một đoạn video hôm nay và anh chàng trong đoạn video chỉ cần viết này để hiểu xem một số thậm chí còn hay không:làm điều gì đó một cách không bình thường nhưng hiệu quả

number/2*2 == number ? true : false ; 

tôi đã cố gắng nó khi tôi về đến nhà và so với

number % 2 == 0 ? true : false ; 

Điều thứ hai là nhanh hơn sau đó tôi thay đổi người đầu tiên như:

number>>1<<1 == number ? true : false; 

t này ime chuyển số một lần sang phải và một lần sang trái làm việc nhanh hơn: D Hiệu suất chênh lệch không lớn chỉ 0-1 giây để xác định tất cả các số giữa 1 và 1000000000 nhưng tôi thích nó rất nhiều và muốn nghe các thủ thuật như vậy từ bạn.

vì vậy còn gì nữa? =)

và một ý tưởng từ Russell Borogove =)

(number&1) == 0; 

Kết quả:

thời gian trôi qua Với Và hoạt động: 00: 00: 07.0504033
Thời gian đã trôi qua với sự thay đổi hoạt động: 00: 00: 06.4653698
Thời gian trôi qua với thao tác mod: 00: 00: 06.8323908

Đáng ngạc nhiên thay đổi hai lần đang hoạt động nhanh hơn một lần và hoạt động trên máy tính của tôi.

+2

Có gì sai với 'even = (number & 1) == 0'? –

Trả lời

7

MIT thực sự giữ một danh sách những thứ như vậy, HAKMEM, có thể được tìm thấy tại http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html. Hầu hết các chương trình liên quan đến lập trình được viết bằng ngôn ngữ lắp ráp, nhưng tôi hiểu rằng một số trong số chúng đã được dịch sang C tại http://graphics.stanford.edu/~seander/bithacks.html.

Bây giờ cho một bài giảng: Những thủ thuật bẩn này có thể nhanh hơn, nhưng mất quá nhiều thời gian để hiểu.

Hầu hết các máy tính không quá quan trọng về mặt hiệu suất nên các thủ thuật như thế này là cần thiết. Trong trường hợp lẻ, number % 2 == 0 rõ ràng hơn và dễ đọc hơn number/2*2 == number hoặc number>>1<<1 == number. Điều đó nói rằng, trong các ứng dụng bình thường, bạn nên luôn sử dụng tùy chọn đơn giản hơn và tiêu chuẩn hơn vì nó sẽ làm cho mã của bạn dễ hiểu và dễ bảo trì hơn.

Tuy nhiên, có trường hợp sử dụng cho các thủ thuật như thế này. Đặc biệt là trong máy tính toán học hoặc khoa học quy mô lớn hoặc đồ họa máy tính, các thủ thuật như thế này có thể cứu mạng bạn. Một ví dụ tuyệt vời về điều này là John Carmack's "magic inverse square root" trong Quake 3.

+0

Một số trong những thủ thuật này thực sự khá hữu ích khi bạn đang lập trình trong lắp ráp cho vi điều khiển khi bạn đang làm việc với một tập lệnh giới hạn và chỉ với rất nhiều chu kỳ. Tuy nhiên, ở các ngôn ngữ cấp cao hơn, chúng thường không cần thiết vì các trình biên dịch thường làm tốt công việc tối ưu hóa chúng. –

+0

@Insilico: tuyệt đối, mặc dù chúng hiếm khi cần thiết trong lập trình chính quy. –

+3

+1 cho căn bậc hai ma thuật :) –

1

Cuốn sách Hacker's Delight là 300 trang không có gì ngoài nội dung như thế này. Nó không rẻ nhưng đó là kinh thánh của một chút.

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