Đôi khi bạn chỉ có các thuật toán không thể tốt hơn thời gian tuyến tính mà vẫn có nhu cầu hiệu năng cao.
Một ví dụ là xử lý video trong đó bạn không thể làm cho hình ảnh / khung hình sáng hơn như một ví dụ cơ bản mà không lặp qua từng pixel (vâng, tôi cho rằng bạn có thể với một số loại cấu trúc phân cấp biểu thị các thuộc tính được thừa hưởng bởi trẻ em cuối cùng rơi xuống các ô hình ảnh đối với các nút lá, nhưng sau đó bạn sẽ trì hoãn chi phí vòng lặp cao hơn qua từng pixel đến trình kết xuất và mã có thể khó duy trì hơn cả bộ lọc hình ảnh được tối ưu hóa vi mô nhất).
Có rất nhiều trường hợp như thế trong lĩnh vực của tôi. Tôi có xu hướng thực hiện nhiều vòng lặp phức tạp tuyến tính hơn mà phải chạm vào mọi thứ hoặc đọc mọi thứ so với các vòng lặp có lợi từ bất kỳ loại cấu trúc dữ liệu hoặc thuật toán phức tạp nào. Không có công việc nào có thể bỏ qua khi mọi thứ phải được chạm vào. Vì vậy, tại thời điểm đó nếu bạn chắc chắn phải đối phó với sự phức tạp tuyến tính, bạn phải làm cho công việc được thực hiện mỗi lần lặp rẻ hơn và rẻ hơn.
Vì vậy, trong trường hợp của tôi, tối ưu hóa quan trọng và phổ biến nhất thường là biểu diễn dữ liệu và bố trí bộ nhớ, đa luồng và SIMD (thường theo thứ tự này với biểu diễn dữ liệu là quan trọng nhất, vì nó ảnh hưởng đến khả năng thực hiện hai điều sau). Tôi không gặp phải quá nhiều vấn đề được giải quyết bằng cây, bảng băm, thuật toán sắp xếp và những thứ tương tự. Mã hàng ngày của tôi là nhiều hơn trong " , cho mỗi điều, làm một cái gì đó."
Tất nhiên đó là một trường hợp khác để nói về khi tối ưu hóa là cần thiết (và quan trọng hơn, khi chúng không), vi mô hoặc thuật toán. Nhưng trong trường hợp cụ thể của tôi, nếu đường dẫn thực thi quan trọng cần tối ưu hóa, mức tăng tốc độ 10 + thường đạt được bằng cách tối ưu hóa ở cấp độ vi mô như đa luồng, SIMD và sắp xếp lại bố cục bộ nhớ và các mẫu truy cập để cải thiện vị trí tham chiếu. Tôi không thường xuyên nói rằng, thay thế một loại bong bóng bằng một loại introort hoặc một loại radix hoặc phát hiện va chạm phức tạp bậc hai với một BVH nhiều như tìm các điểm nóng, ví dụ, được hưởng lợi từ việc tách trường nóng / lạnh.
Bây giờ trong trường hợp của tôi, lĩnh vực của tôi rất quan trọng về hiệu năng (raytracing, động cơ vật lý, v.v.) rằng một raytracer chậm nhưng hoàn toàn chính xác, mất 10 giờ để hiển thị một hình ảnh thường được coi là vô dụng hoặc hơn một cách nhanh chóng hoàn toàn tương tác nhưng xuất ra những hình ảnh xấu nhất với các tia bị rò rỉ ở khắp mọi nơi do thiếu giao thoa tia nước / tri. Tốc độ được cho là chỉ số chất lượng chính của phần mềm như vậy, thậm chí còn hơn cả tính chính xác ở một số điểm (vì "tính chính xác" là một ý tưởng mờ nhạt với raytracing vì mọi thứ đều gần đúng, miễn là nó không bị hỏng hoặc bất cứ điều gì tương tự). Và khi đó, nếu tôi không nghĩ về việc trả trước hiệu quả, tôi thấy tôi phải thực sự thay đổi mã ở mức thiết kế đắt nhất để xử lý các thiết kế hiệu quả hơn. Vì vậy, nếu tôi không '
Chơi game là một lĩnh vực tương tự như của tôi. Không quan trọng logic logic của trò chơi của bạn như thế nào hoặc khả năng duy trì và thiết kế tuyệt vời của cơ sở mã của bạn như thế nào nếu trò chơi của bạn chạy ở tốc độ 1 khung hình mỗi giây như trình chiếu. Trong một số trường nhất định, việc thiếu tốc độ thực sự có thể khiến ứng dụng trở nên vô dụng đối với người dùng. Không giống như các trò chơi, không có số liệu "đủ tốt" trong các lĩnh vực như raytracing. Người dùng luôn muốn có nhiều tốc độ hơn và cạnh tranh công nghiệp chủ yếu là tìm kiếm các giải pháp nhanh hơn. Nó sẽ không bao giờ đủ tốt cho đến thời gian thực, tại thời điểm đó, các trò chơi sẽ sử dụng các công cụ theo dõi đường dẫn. Và sau đó có lẽ nó vẫn chưa đủ tốt cho VFX, kể từ đó, các nghệ sĩ có thể muốn tải hàng tỷ đa giác và có các mô phỏng hạt với sự tự va chạm giữa hàng tỷ hạt ở tốc độ 30+ FPS.
Bây giờ nếu nó thoải mái, mặc dù tôi vẫn viết khoảng 90% mã bằng ngôn ngữ kịch bản (Lua) mà không phải lo lắng về hiệu suất. Nhưng tôi có một số lượng mã lớn bất thường thực sự cần phải lặp qua hàng triệu đến hàng tỷ thứ và khi bạn lặp qua hàng triệu đến hàng tỷ thứ, bạn bắt đầu nhận thấy sự khác biệt sử thi giữa mã đơn luồng ngây thơ đó gọi một lỗi bộ nhớ cache với mỗi lần lặp so với nói, mã vectơ chạy song song truy cập các khối liền kề trong đó không có dữ liệu không liên quan được tải vào một dòng bộ đệm.