2010-07-31 35 views
7

Nếu tôi có mã như thế nàyMất bao lâu để tràn một thời gian dài bằng cách tăng thêm (bắt đầu từ số không)?

for (long i = 0; i < Long.MAX_VALUE; i++) 
    { 
     //do something trivial 
    } 

bao lâu nó sẽ đưa lý thuyết cho vòng lặp để kết thúc?

+2

Tiêu đề của câu hỏi không phù hợp với câu hỏi thực tế đặt ra. Vui lòng chỉnh sửa cái này hoặc cái kia. Bạn có quan tâm đến số học modulo hoặc tốc độ thực thi không? Đã hoàn tất – seh

+0

. tiêu đề mới phản ánh bài đăng IMHO tốt hơn nhiều – pdeva

+0

oh, khoảng 68 năm, cho đủ thời lượng ngắn và kích thước trung bình "một số điều nhỏ nhặt" http://en.wikipedia.org/wiki/Year_2038_problem – msw

Trả lời

15

Giả sử, chỉ vì lợi ích của đối số, bạn có một máy tính rất nhanh có thể thực hiện khoảng 2 tỷ vòng lặp mỗi giây (máy 2 GHz chỉ có thể hầu như không làm điều đó nếu thực sự không có gì vòng lặp). Kể từ Long.MAX_VALUE là 2 tỷ lần 4 tỷ, vòng lặp đó sẽ mất khoảng 4 tỷ giây, hoặc một cái gì đó hơn 120 năm.

Không có điểm nào khi bắt đầu vòng lặp đó ngay hôm nay. Chờ cho đến khi máy tính chạy nhanh hơn, và sau đó nó sẽ được thực hiện sớm hơn.

+1

Tôi nghĩ rằng thời gian là một nửa - tôi không chắc mình có số thập phân của tôi đúng, nhưng thời gian dài được ký vì vậy nó là 2^63/4 tỷ = 2,3 tỷ. –

+0

Toán học đã tính toán cho điều đó. Do đó là "2 tỷ lần 4 tỷ" (2^31 * 2^32). – cHao

+0

Làm thế nào để bạn tính toán "máy 2 GHz có thể thực hiện khoảng 2 tỷ vòng lặp mỗi giây"? –

4

Tôi tin rằng câu trả lời bạn đang tìm kiếm là: Nó sẽ không kết thúc trong cuộc đời bạn.

Chỉnh sửa: Tôi nên đủ điều kiện - Trên phần cứng hiện có hoặc bất kỳ phần cứng nào tôi có thể quan tâm; có lẽ khi tính toán lượng tử trở nên phổ biến, bạn sẽ phải đánh giá lại câu hỏi này.

+0

Tôi không thấy bất kỳ lý do hợp lệ nào để từ chối điều này. Vì vậy, thêm +1 để bù đắp. –

+1

tôi không nghĩ rằng điều này là chính xác. Nếu máy tính tiếp tục xu hướng mà họ đã có, điều này sẽ dễ dàng có thể thực hiện được trong suốt cuộc đời. Mỗi lần một máy tính tăng gấp đôi tốc độ, nó giảm thời gian làm đôi, điều đó có nghĩa là tốc độ tăng gấp đôi sẽ là 60 năm. Ngoài ra, vòng lặp lặp lại không phải là trong lớp của các vấn đề máy tính lượng tử sẽ có thể giải quyết bằng cách sử dụng ma thuật đen của họ. – hvgotcodes

+0

@hvgotcodes - Rõ ràng rằng OP đang hỏi về việc bắt đầu tính toán "bây giờ" bằng cách sử dụng một máy tính mà anh ta có thể có được "bây giờ", và để cho tính toán chạy liên tục cho đến khi nó kết thúc. Nếu không, câu hỏi không có câu trả lời hợp lý. –

2

Điều này có thể mất thời gian để chạy.

Nhưng theo tiêu đề của câu hỏi, tôi đoán bạn đang cố gắng chạy một vòng lặp với số lần rất cao và bạn đang có kế hoạch phá vỡ vòng lặp khi một điều kiện nhất định xảy ra. tức là bạn có một số

if (ancondition == true) 
{ 
    break; 
} 

Và bạn chỉ cần đảm bảo bạn không nhận được bất kỳ ngoại lệ nào do tràn. (ví dụ: bạn sẽ theo dõi một cảm biến địa chấn trong nhiều năm.) Vì vậy, trong phạm vi đó bạn có thể an toàn để đi.

Nhưng mặt khác, đây không phải là cách tiếp cận lập trình tốt. Chắc chắn bạn có thể cải thiện mã bằng cách sử dụng một cách khác. (Có thể kiểm tra định kỳ)

0

đặt này vào wolframalpha.com

(2^63 -1)/(2 * 10^9) giây

2^63-1 là giá trị hiện tại là MAX_VALUE và 2 * 10^9 là bộ xử lý 2 GHZ tăng vòng lặp một lần mỗi lần đánh dấu đồng hồ.

bây giờ đặt

(2^63 -1)/(4 * 10^9) giây

đại diện cho tăng gấp đôi tốc độ máy đến 4 GHZ.

siêu máy tính nhanh nhất có 1.75 petaflops (10^15). Đó là một ứng dụng song song, do đó, nó không phải là một vòng lặp lớn, nhưng nếu bạn hỏi "mất bao lâu để làm 2^63-1 flops", trên máy đó của nó

http://www.wolframalpha.com/input/?i=(2^63 + -1)/(1.75 * 10^15) + giây

Tốc độ nhanh nhất mà chúng tôi đã nhận được một bóng bán dẫn để chạy là 500 GHZ. từ http://en.wikipedia.org/wiki/Moore 's_law

"transistor hoạt động trên 500 GHz ở 4,5 K (−451 ° F/−268.65 ° C) [41] và mô phỏng cho thấy rằng nó có khả năng chạy ở 1 THz (1.000 GHz). thử nghiệm này chỉ thử nghiệm một bóng bán dẫn duy nhất."

vì vậy nếu bạn cắm vào ma trận alpha, bạn sẽ nhận được 7 tháng. Vì vậy, một bóng bán dẫn đơn không phải là một đơn vị xử lý vòng lặp, nhưng bạn sẽ có được điểm. Phần cứng có thể hiểu được nằm trong phạm vi nắm bắt công nghệ của chúng tôi, thậm chí để chuyển qua 2^63-1 loop iterations Nếu bạn xem OP là "khoảng thời gian để thực hiện 2^63 bit flips", thì máy này đáp ứng các tiêu chí đó, và dễ dàng hoàn thành trong một đời.

Nhưng khi chúng ta chuyển sang 128 bit máy tính, chúng tôi không có cơ hội ...

+0

Tôi sẽ không mong đợi tính toán 128 bit bất kỳ lúc nào. Nó có thể có vẻ cliche để nói "64 bit nên đủ lớn cho tất cả mọi người", nhưng đối với hầu hết các phần nó được. Tần suất bạn phải lưu trữ số lớn hơn 2^63? – Gabe

1

một câu trả lời có thể là số không giây. Trình biên dịch có thể rất tích cực và tối ưu hóa toàn bộ vòng lặp của bạn, vì dường như không làm bất cứ điều gì thú vị ...

đây là một câu chuyện có liên quan tuyệt vời: các trình biên dịch được tối ưu hóa trong một vòng lặp tìm kiếm ví dụ truy cập của Định lý cuối cùng của Fermat. bởi vì Định lý là chính xác (vì vậy chúng tôi được cho biết) và không có ví dụ truy cập, vòng lặp sẽ không bao giờ chấm dứt. nhưng các trình biên dịch quyết định nó sẽ chấm dứt.

http://blog.regehr.org/archives/161

(bài báo đề cập rằng một trình biên dịch java không được phép chấm dứt vòng lặp Fermat)

+0

Chuyển sang int, trên 5u20 tôi nhận '0.409u 0.133s 0: 00.59 89.8% 0 + 0k 0 + 4io 2pf + 0w' (tôi nghĩ điều đó có nghĩa là khoảng nửa giây). –

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