Giữ tối ưu hóa cục bộ, làm cho chúng rõ ràng, ghi lại chúng tốt và giúp dễ dàng so sánh các phiên bản được tối ưu hóa với nhau và với phiên bản không được tối ưu hóa, cả về mã nguồn và hiệu suất thời gian chạy.
Câu trả lời đầy đủ
Nếu optimisations như vậy thực sự là quan trọng với sản phẩm của bạn, sau đó bạn cần phải biết tại sao không chỉ optimisations là hữu ích trước đây, mà còn cung cấp đủ thông tin để các nhà phát triển giúp đỡ biết liệu họ sẽ có ích trong tương lai.
Lý tưởng nhất, bạn cần đưa thử nghiệm hiệu suất vào quy trình xây dựng của mình, để bạn tìm ra khi nào các công nghệ mới làm mất hiệu lực tối ưu hóa cũ.
Nhớ lại:
Nguyên tắc tối ưu hóa chương trình đầu tiên: Đừng làm điều đó.
Quy tắc tối ưu hóa chương trình thứ hai (chỉ dành cho chuyên gia!): Đừng làm điều đó. "
- Michael A. Jackson
Để biết liệu bây giờ là thời gian yêu cầu điểm chuẩn và thử nghiệm.
Như bạn đã đề cập, vấn đề lớn nhất với mã được tối ưu hóa cao là rất khó để duy trì, vì vậy, càng nhiều càng tốt, bạn cần giữ các phần được tối ưu hóa tách biệt với các phần không được tối ưu hóa. Cho dù bạn thực hiện điều này thông qua liên kết thời gian biên dịch, các cuộc gọi chức năng ảo thời gian chạy hoặc một cái gì đó ở giữa không nên quan trọng. Điều quan trọng là khi bạn chạy thử nghiệm, bạn muốn có thể thử nghiệm tất cả các phiên bản mà bạn hiện đang quan tâm.
Tôi sẽ có xu hướng xây dựng một hệ thống theo cách mà phiên bản cơ bản không được tối ưu hóa của mã sản xuất luôn có thể được sử dụng để hiểu ý định của mã, sau đó xây dựng các mô-đun được tối ưu hóa khác nhau cùng với phiên bản được tối ưu hóa này, có tài liệu rõ ràng ở bất cứ đâu phiên bản tối ưu hóa khác với dòng cơ sở. Khi bạn chạy thử nghiệm (đơn vị và tích hợp), bạn chạy nó trên phiên bản chưa được tối ưu hóa và trên tất cả các mô-đun được tối ưu hóa hiện tại.
Thí dụ
Chẳng hạn, giả sử bạn có chức năng Biến đổi Fourier nhanh . Có thể bạn có một triển khai thuật toán cơ bản fft.c
và thử nghiệm trong fft_tests.c
.
Sau đó, đến Pentium và bạn quyết định triển khai phiên bản điểm cố định fft_mmx.c
bằng cách sử dụng các hướng dẫn MMX . Sau đó, pentium 3 xuất hiện và bạn quyết định thêm một phiên bản sử dụng Tiện ích mở rộng Truyền SIMD trong fft_sse.c
.
Bây giờ bạn muốn thêm CUDA , vì vậy bạn thêm fft_cuda.c
, nhưng thấy rằng với bộ dữ liệu thử nghiệm mà bạn đã sử dụng trong nhiều năm, phiên bản CUDA chậm hơn phiên bản SSE! Bạn thực hiện một số phân tích và kết thúc việc thêm một tập dữ liệu lớn hơn 100 lần và bạn sẽ tăng tốc độ mà bạn mong đợi, nhưng bây giờ bạn biết rằng thời gian thiết lập để sử dụng phiên bản CUDA rất quan trọng và với các bộ dữ liệu nhỏ bạn nên sử dụng thuật toán mà không có chi phí thiết lập.
Trong mỗi trường hợp này, bạn đang thực hiện cùng một thuật toán, tất cả sẽ hành xử theo cùng một cách, nhưng sẽ chạy với hiệu quả và tốc độ khác nhau trên các kiến trúc khác nhau (nếu chúng sẽ chạy hoàn toàn). Tuy nhiên, từ quan điểm mã, bạn có thể so sánh bất kỳ cặp tệp nguồn nào để tìm hiểu lý do tại sao cùng một giao diện được triển khai theo các cách khác nhau và thông thường, cách dễ nhất sẽ là quay lại phiên bản gốc không được tối ưu hóa.
Tất cả đều giống nhau đối với việc triển khai OOP trong đó một lớp cơ sở thực hiện thuật toán không được tối ưu hóa và các lớp dẫn xuất thực hiện các tối ưu hóa khác nhau.
Điều quan trọng là giữ những thứ giống nhau , sao cho sự khác biệt là rõ ràng .