2014-04-21 15 views
5

Trong hai đoạn mã sau, có thực sự là khác nhau tùy theo tốc độ biên dịch hay chạy không?Bạn có tiếp tục tức thì không?

for (int i = 0; i < 50; i++) 
{ 
    if (i % 3 == 0) 
     continue; 

    printf("Yay"); 
} 

for (int i = 0; i < 50; i++) 
{ 
    if (i % 3 != 0) 
     printf("Yay"); 
} 

Cá nhân, trong tình huống mà có nhiều hơn một tuyên bố in, tôi đã sử dụng phương pháp đầu tiên để làm giảm lượng thụt đầu dòng cho mã chứa . Đã tự hỏi trong một thời gian để tìm thấy nó về thời gian tôi hỏi liệu nó thực sự có một hiệu ứng khác hơn là trực quan.

Trả lời Alf (tôi không thể nhận được mã làm việc trong ý kiến ​​...)

Nhiều chính xác để sử dụng của tôi là một cái gì đó dọc theo dòng của một hàm "handleObjectMovement" trong đó sẽ bao gồm

for each object 
    if object position is static 
     continue 

    deal with velocity and jazz 

so với

for each object 
    if object position is not static 
     deal with velocity and jazz 

Do đó tôi không sử dụng trở lại. Về cơ bản "nếu nó không liên quan đến sự lặp lại này, di chuyển trên"

+0

Tôi nghĩ xử lý các trường hợp nhỏ hoặc trường hợp lỗi đầu tiên trong hàm, sử dụng 'return' to ** bail out **, là OK. Nhưng 'tiếp tục' có nghĩa là người đọc mã phải sử dụng thêm nỗ lực để phân tích. Hãy nhớ rằng viết mã nguồn không phải là về giao tiếp với trình biên dịch những gì nó nên làm, rất nhiều như giao tiếp với người khác hoặc tự sau của bạn những gì * ý định * của bạn. –

+3

Trình biên dịch tốt nên tối ưu hóa nguồn tương đương thành cùng một mã assembly. Cho dù điều đó thực sự xảy ra trong bất kỳ trường hợp cụ thể nào cũng phụ thuộc vào quá nhiều điều cần biết trước. Vậy tại sao bạn không tự mình kiểm tra? Kiểm tra lắp ráp được tạo ra và/hoặc đo thời gian và bạn sẽ có câu trả lời. –

+0

Hai lý do Branko, thứ hai là xấu, nhưng thứ hai tôi cảm thấy khá tốt: P 1) Tôi lười biếng 2) Sẽ rất hữu ích nếu bạn có những câu hỏi này chỉ cần một google. Bây giờ bất cứ ai khác tự hỏi họ có cùng một trang SO họ có thể đi đến. – Randomman159

Trả lời

8

Các hành vi là như nhau, vì thế tốc độ runtime nên được như vậy trừ khi trình biên dịch làm điều gì đó ngu ngốc (hoặc trừ khi bạn tắt tối ưu hóa).

Không thể nói liệu có sự khác biệt về tốc độ biên dịch hay không, vì nó phụ thuộc vào chi tiết về cách trình biên dịch phân tích, phân tích và dịch hai biến thể.

Nếu tốc độ là quan trọng, hãy đo.

1

Nếu bạn biết rằng những chi nhánh của tình trạng này có xác suất cao hơn bạn có thể sử dụng GCC likely/unlikely macro

1

Làm thế nào về việc thoát khỏi việc kiểm tra hoàn toàn?

for (int t = 0; t < 33; t++) 
{ 
    int i = t + (t >> 1) + 1; 

    printf("%d\n", i); 
} 
+1

Tôi nghĩ anh ấy thực sự hỏi về hành vi của trình biên dịch không phải mã đặc biệt này – gbtimmon

+1

^Như gbtimmon đã nói. – Randomman159

+1

Tuy nhiên, bạn sẽ ngạc nhiên về việc có thể xóa bao nhiêu lần sử dụng tiếp tục bằng cách viết mã thông minh hơn. Bạn có một ví dụ khác, phức tạp hơn trong tâm trí? – fredoverflow

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