2017-09-24 39 views
6

Tôi có một số kinh nghiệm về viết mã nhưng một trong những câu hỏi lớn nhất khiến tôi khó chịu là cách cải thiện mã của mình.Làm cách nào để đo lường chất lượng mã của tôi?

tôi mỗi lần kiểm tra phức tạp, dễ đọcđúng đắn của mã nhưng câu hỏi của tôi là làm thế nào tôi có thể đo kích thước và thời gian của các lệnh cụ thể.

Ví dụ:

khi tôi có vấn đề tiếp theo:

A là một số nguyên

B là một số nguyên

C là một số nguyên

if - A là bi gger B gán C=A

else - C=B

cho vấn đề đó, chúng tôi có 2 giải pháp rất đơn giản -

1. sử dụng lệnh if-else

2. sử dụng nhà điều hành ternary

để kiểm tra kích thước tệp khô trước khi biên soạn, tôi nhận được rằng tập tin giải pháp thứ hai là ít hơn từ đầu tiên trong một nửa (cho 1000000 hoạt động tôi nhận được một sự khác biệt của một số MB).

Câu hỏi của tôi là làm thế nào tôi có thể đo lường sự chênh lệch thời gian giữa một số mã mà làm cho các hoạt động tương tự nhưng với lệnh khác nhau, và bao nhiêu trình biên dịch làm cho tối ưu hóa cho các lệnh đó là gần như 2 từ ví dụ.

+0

Thành thật mà nói, thật khó để đo được các khung thời gian thấp. Tôi rất quan tâm đến câu trả lời từ mọi người vì việc đo cái nào tốt hơn là khá đơn giản (ghi lại thời gian sau mỗi lần thực hiện và sau khi hoạt động đạt 1000000), điều này sẽ không cho bạn thời gian thực thi chính xác mà Trung bình. Nhưng làm thế nào để có được thời gian thực hiện chính xác là một bí ẩn đối với tôi cũng vậy. –

+1

@Ante - Nếu sự khác biệt quá nhỏ đến nỗi không thể đo được, tại sao chúng ta quan tâm ngay từ đầu? –

+1

Thời gian thực hiện! = Tập thể dục cho mục đích –

Trả lời

3

Phân tích độ phức tạp thời gian của hai thuật toán. Nếu chúng có vẻ cạnh tranh,

Điểm chuẩn.

Cung cấp đầu vào đủ lớn cho vấn đề của bạn, để thời gian không bị ảnh hưởng bởi các khoản chi phí -OS khác.

Phát triển hai chương trình giải quyết cùng một vấn đề, nhưng với cách tiếp cận khác.

Tôi có một số phương pháp trong Time measurements cho mã thời gian. Ví dụ:

#include <sys/time.h> 
#include <time.h> 

typedef struct timeval wallclock_t; 

void wallclock_mark(wallclock_t *const tptr) 
{ 
    gettimeofday(tptr, NULL); 
} 

double wallclock_since(wallclock_t *const tptr) 
{ 
    struct timeval now; 
    gettimeofday(&now, NULL); 

    return difftime(now.tv_sec, tptr->tv_sec) 
      + ((double)now.tv_usec - (double)tptr->tv_usec)/1000000.0; 
} 

int main(void) 
{ 
    wallclock_t t; 
    double s; 

    wallclock_mark(&t); 

    /* 
    * Solve the problem with Algorithm 1 
    */ 

    s = wallclock_since(&t); 
    printf("That took %.9f seconds wall clock time.\n", s); 
    return 0; 
} 

Bạn sẽ nhận được phép đo thời gian. Sau đó, bạn sử dụng giải quyết vấn đề với "Thuật toán 2", ví dụ, và so sánh các phép đo này.


PS: Hoặc bạn có thể kiểm tra mã hội của mọi cách tiếp cận, để có cách tiếp cận cấp thấp hơn.

2

Một trong những cách là sử dụng chức năng thời gian trong bash shell theo sau là thực hiện lặp lại cho một số lượng lớn lần. Điều này sẽ hiển thị cái nào tốt hơn. Và tạo một mẫu không có gì trong cả hai và bạn có thể biết thời gian đệm.

Vui lòng tính toán cho nhiều trường hợp và so sánh số trung bình trước khi đưa ra bất kỳ kết luận nào.

4

Cách tốt nhất và trực tiếp nhất là kiểm tra mã lắp ráp được tạo bởi trình biên dịch của bạn ở cấp tối ưu hóa khác nhau.

// EDIT

tôi không đề cập đến điểm chuẩn, vì câu hỏi của bạn là về việc kiểm tra sự khác biệt giữa hai mã nguồn sử dụng công trình xây dựng ngôn ngữ khác nhau để thực hiện công việc tương tự.

Đừng hiểu lầm, làm việc với giải pháp đảm bảo hiệu suất phần mềm chung, nhưng trong trường hợp cụ thể này, nó có thể không đáng tin cậy, vì khung thời gian thực hiện rất nhỏ. Ngay cả khi bạn tính toán thời gian khấu hao từ nhiều lần chạy, sự khác biệt có thể phụ thuộc nhiều vào hệ điều hành và môi trường và do đó gây ô nhiễm kết quả của bạn.

Để tìm hiểu thêm về chủ đề tôi khuyên bạn nên this talk from Cppcon, đó là hành động thú vị.

Nhưng quan trọng nhất,

nhanh cái nhìn dưới mui xe bằng cách khám phá mã lắp ráp có thể cung cấp cho bạn thông tin cho dù hai câu lệnh đã được tối ưu hóa vào cùng một mã chính xác. Nó có thể không được như vậy rõ ràng từ điểm chuẩn mã.

Trong trường hợp bạn hỏi (nếu so với toán tử hàng năm), nó luôn luôn dẫn đến cùng một mã máy, bởi vì toán tử tenary chỉ là một đường cú pháp cho nếu và thực chất nó thực sự là cùng một thao tác.

+0

Nếu bạn có đủ kinh nghiệm tối ưu hóa mã cho tốc độ và do đó có được một sự thu hồi tổng quát tốt về các bảng chỉ dẫn của Agner Fog; đôi khi tất cả phải mất là một cái nhìn nhanh chóng tại đầu ra lắp ráp để xác định mã tốt hơn ... hoặc rằng nó làm cho không có sự khác biệt khi tối ưu hóa và bạn chỉ nên sử dụng mã đơn giản hơn. Nó càng trở nên ít khó khăn hơn với nhiều kinh nghiệm hơn. – technosaurus

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