2013-09-03 38 views
21

Tôi tự hỏi nếu có một sự khác biệt về hiệu năng giữaHiệu suất: lớn/nhỏ hơn so với không bằng

kiểm tra nếu một giá trị lớn/nhỏ hơn khác

for(int x = 0; x < y; x++); // for y > x 

kiểm tra xem giá trị có bằng không khác

for(int x = 0; x != y; x++); // for y > x 

và tại sao?

Ngoài ra: Điều gì xảy ra nếu tôi so sánh với 0, có sự khác biệt nào khác không?

Sẽ rất tuyệt nếu các câu trả lời cũng xem xét một chế độ xem được giải mã trên mã.

EDIT: Vì hầu hết các bạn đã chỉ ra sự khác biệt về hiệu suất của khóa học là không đáng kể nhưng tôi quan tâm đến sự khác biệt về cấp cpu. Hoạt động nào phức tạp hơn?

Đối với tôi, đó là một câu hỏi để tìm hiểu/hiểu kỹ thuật.

Tôi đã xóa thẻ Java, mà tôi đã thêm vô tình vì câu hỏi có nghĩa là thường không chỉ dựa trên Java, xin lỗi.

+1

Có lẽ có liên quan: http://en.wikibooks.org/wiki/Microprocessor_Design/ALU_Flags –

Trả lời

4

Có hiếm khi là một buổi biểu diễn hit nhưng là người đầu tiên là đáng tin cậy hơn vì nó sẽ xử lý cả hai trường hợp đột xuất nơi

  1. y < 0 để bắt đầu
  2. x hoặc y là điều sai lầm với bên trong khối .
21

Bạn vẫn nên làm những gì rõ ràng hơn, an toàn hơn và dễ hiểu hơn. Những cuộc thảo luận vi điều chỉnh thường là một sự lãng phí thời gian của bạn vì

  • họ hiếm khi tạo sự khác biệt có thể đo lường
  • khi họ thực hiện một sự khác biệt này có thể thay đổi nếu bạn sử dụng một JVM khác nhau, hoặc bộ xử lý. tức là không có cảnh báo.

Lưu ý: máy được tạo cũng có thể thay đổi với bộ vi xử lý hoặc JVM, vì vậy, điều này không hữu ích trong hầu hết các trường hợp, ngay cả khi bạn rất quen thuộc với mã lắp ráp.

Điều quan trọng hơn nhiều là khả năng bảo trì của phần mềm.

+0

1 Tôi luôn thích câu trả lời của bạn cho câu hỏi liên quan đến hiệu suất và hiệu quả. Đặc biệt bởi vì tôi quá tệ với nó :) –

+0

@RohitJain Hoặc bạn nhận ra nó không dễ dàng như việc đoán xem điều gì có thể là một ý tưởng hay. Rất khó để tìm một ví dụ tốt hơn cho lý do biểu diễn ngay cả khi nó mơ hồ hơn. –

+0

@PeterLawrey +1 Đồng ý. Không được xem xét trừ khi ứng dụng của bạn cần chạy tối ưu nhất có thể (Chẳng hạn như chạy trong môi trường với khả năng bộ nhớ/tính toán hạn chế hoặc một số mô phỏng siêu phức tạp cần nhiều nước nhất có thể). Nếu không, bạn đang lãng phí tất cả không gian trống đó, yo. –

13

Hiệu suất là hoàn toàn không đáng kể. Dưới đây là một số mã để chứng minh điều đó:

public class OpporatorPerformance { 
    static long y = 300000000L; 

    public static void main(String[] args) { 
     System.out.println("Test One: " + testOne()); 
     System.out.println("Test Two: " + testTwo()); 
     System.out.println("Test One: " + testOne()); 
     System.out.println("Test Two: " + testTwo()); 
     System.out.println("Test One: " + testOne()); 
     System.out.println("Test Two: " + testTwo()); 
     System.out.println("Test One: " + testOne()); 
     System.out.println("Test Two: " + testTwo()); 

    } 

    public static long testOne() { 
     Date newDate = new Date(); 
     int z = 0; 
     for(int x = 0; x < y; x++){ // for y > x 
      z = x; 
     } 
     return new Date().getTime() - newDate.getTime(); 
    } 

    public static long testTwo() { 
     Date newDate = new Date(); 
     int z = 0; 
     for(int x = 0; x != y; x++){ // for y > x 
      z = x; 
     } 
     return new Date().getTime() - newDate.getTime(); 
    } 

} 

Kết quả:

Test One: 342 
Test Two: 332 
Test One: 340 
Test Two: 340 
Test One: 415 
Test Two: 325 
Test One: 393 
Test Two: 329 
+0

+1 Lần chạy cuối cùng của tôi, tôi đã nhận được 'Kiểm tra một: 113 Kiểm tra hai: 113' trên máy tính xách tay của tôi. –

+4

Bạn nên sử dụng System.nanoTime() để đo điểm chuẩn, cung cấp cho bạn độ chính xác cao hơn. –

+1

@RohitJain, cảm ơn! Bằng cách nào đó tôi chưa học được điều đó. Điều tôi thích về nó là bây giờ tôi không cần phải nhập 'java.util.Date'. Mặc dù, javadoc nói rằng "Phương pháp này cung cấp độ chính xác nano giây, nhưng không nhất thiết phải là độ phân giải nano giây (nghĩa là giá trị thay đổi thường xuyên như thế nào) - không đảm bảo được thực hiện ngoại trừ độ phân giải ít nhất là độ phân giải của currentTimeMillis(). " Vì vậy, tôi sẽ không nhất thiết phải tin tưởng độ chính xác của độ chính xác thêm. –

1

Wonder nếu lồng nhau cho mỗi bài kiểm tra, kết quả tương tự?

for(int x = 0; x < y; x++) 
{ 
    for(int x2 = 0; x2 < y; x2++) {} 
} 

for(int x = 0; x != y; x++) 
{ 
    for(int x2 = 0; x2 != y; x2++) {}  
} 
Các vấn đề liên quan