Tôi gặp phải câu hỏi này khi tôi trả lời một câu hỏi khác. Làm thế nào để trình biên dịch tối ưu hóa mã? Các từ khóa có thể như const, ... help? Bên cạnh thực tế với các chất bay hơi và chức năng nội tuyến và làm thế nào để tối ưu hóa mã tất cả bởi chính bạn!Trình biên dịch tối ưu hóa mã của chúng tôi như thế nào?
Trả lời
Trình biên dịch được tự do tối ưu hóa mã miễn là chúng có thể đảm bảo ngữ nghĩa của mã không bị thay đổi.
Tôi sẽ đề xuất bắt đầu từ trang wikipedia Compiler optimization vì có nhiều loại tối ưu hóa khác nhau được thực hiện ở nhiều giai đoạn khác nhau. Như bạn có thể thấy, các trình biên dịch hiện đại rất 'thông minh' khi tối ưu hóa mã (mã C biên dịch thường nhanh hơn so với viết tay trừ khi lập trình viên thực sự biết cách tận dụng tất cả các hướng dẫn và quirks bộ xử lý cụ thể). Như những người khác đã nói, viết cho sự rõ ràng đầu tiên dựa trên một thiết kế tốt.
trình biên dịch có thể làm điều đó nếu họ biết mã phần cứng của họ đang chạy trong! đôi khi GPU nên xâm nhập vào, chúng làm hỏng. Gần đây tôi đã viết một mã mà sử dụng cả cpu và gpu (cuda) và lỗi chỉ là tối ưu hóa O2 đơn giản. Khi tôi tắt nó đi, mọi thứ đều có ý nghĩa. –
@Green Code: Trình biên dịch cũng là phần mềm, do đó tất nhiên đôi khi chúng bị lỗi. Nhưng đối với các trình biên dịch trưởng thành, đầu ra thường chính xác và cực nhanh so với bất kỳ phần mềm lập trình nào có thể tự viết. – delnan
@Green Code: có nhiều cấp độ tối ưu hóa khác nhau. Một số là máy độc lập, một số thì không. Phụ thuộc máy có thể không có lỗi, đặc biệt là đối với kiến trúc trẻ, đơn giản vì chúng chưa được thử nghiệm rộng rãi. CUDA cũng mang lại một khó khăn mới: đột nhiên có những phần của mã cần được tối ưu hóa cho CPU và các mã khác cho GPU. Không có trình biên dịch C++ nào mà tôi biết có nghĩa là tối ưu hóa cho hai kiến trúc khác nhau cùng một lúc. –
Một điều rất lớn bạn có thể làm (ngoài những gì trình biên dịch có thể làm cho bạn) là nhận thức được bộ nhớ cache. Kể từ khi truy cập vào bộ nhớ thực sự là tốn kém thời gian, bộ nhớ cache cố gắng giúp bạn bằng cách lưu trữ không chỉ các dữ liệu bạn truy cập nó, nhưng các yếu tố gần đó là tốt. Đây là lý do tại sao foo
sẽ chạy nhanh hơn rất nhiều so với bar
:
array[ NUM_ROWS ][ NUM_COLS ];
foo()
{
int row, col;
int sum = 0;
// accesses the elements in the array continuously
for (row = 0; row < NUM_ROWS ; row++)
{
for (col = 0; col < NUM_COLS; col++)
{
sum += array[ row ][ col ];
}
}
}
bar()
{
int row, col;
int sum = 0;
// skips from row to row (big jumps that might miss the cache)
for (col = 0; col < NUM_COLS ; col++)
{
for (row = 0; row < NUM_ROWS; row++)
{
sum += array[ row ][ col ];
}
}
}
Edit: Một điều cần phải nhận thức được lặp lại chuỗi nối. Làm sai, điều này có thể làm cho mã mà dường như khác để chạy trong O(n)
thực sự có trong O(n^2)
- xem một bài viết về Joel on Software
Edit: s/đĩa/bộ nhớ/
Điều thú vị bạn nên quan tâm về những điều cấp thấp như vậy và vẫn viết hàng ++ thay vì ++ hàng: P –
Mã ví dụ của bạn phải làm gì khi truy cập đĩa? – JeremyWeir
là nhận thức của bộ nhớ cache sẽ giúp bạn tiết kiệm nhiều hơn hàng + +: P @jayrdub: liên quan đến giải thích về cách bộ nhớ * thực sự * hoạt động trong máy. Về cơ bản, 'mảng [row] [col]' là một cuộc gọi đến bộ nhớ chính được lưu trữ ban đầu trên đĩa cứng. Bởi vì đĩa cứng di chuyển chậm hơn rất nhiều so với CPU, các máy tính sẽ lưu trữ thông tin trong một 'cache', nơi nó dễ truy cập hơn. –
Các quy tắc tối ưu hóa:
- Đừng làm điều đó
- người dùng nâng cao Chỉ: Đừng làm điều đó chưa
Chỉnh sửa: Trích dẫn (và các thông tin khác, hữu ích hay không) có thể được tìm thấy trong bài viết Mã hóa: Hardware is cheap, programmers are expensive. Nó sẽ là tốt đẹp để tìm 'nguồn gốc' của cụm từ này/trích dẫn mặc dù.
Câu hỏi không phải là về tối ưu hóa thủ công, nhưng trình biên dịch có thể làm gì và cách chúng thực hiện nó. – DerKuchen
Xin chào, Cảm ơn lời khuyên của bạn, nhưng tôi đoán tôi đang ở trên cạnh của việc học nó hoàn toàn vì vậy tôi không muốn hiểu lầm nó. –
@ DerKuchen: vâng, đó là về cả hai. –
- 1. Tối ưu hóa trình biên dịch Erlang
- 2. Khi nào trình biên dịch tối ưu hóa mã của tôi
- 3. Cách tắt trình biên dịch tối ưu hóa của V8
- 4. Trình biên dịch tối ưu hóa chức năng giai thừa này như thế nào?
- 5. Làm thế nào tối ưu hóa trình biên dịch có thể ảnh hưởng đến logic mã?
- 6. C++ 0x tối ưu hóa chất lượng trình biên dịch
- 7. Mã Java "sao chép" được tối ưu hóa bởi trình biên dịch JIT JVM như thế nào?
- 8. C tối ưu hóa cấu trúc trình biên dịch
- 9. Trình biên dịch có tối ưu hóa điều này không
- 10. Ở mức độ nào trình biên dịch C# hoặc JIT tối ưu hóa mã ứng dụng?
- 11. Trình biên dịch của tôi đang làm gì? (tối ưu hóa memcpy)
- 12. Cách tốt nhất để mở rộng API chrome mở rộng, để làm việc với Trình biên dịch Tối ưu hóa Trình biên dịch Tối ưu hóa?
- 13. Tối ưu hóa mã SSE của GCC
- 14. Trình biên dịch C# có đủ thông minh để tối ưu hóa mã này không?
- 15. Trình biên dịch C/C++ có tối ưu hóa trên các đơn vị biên dịch không?
- 16. Khái niệm về "xóa mã chết" trong các tùy chọn tối ưu hóa trình biên dịch
- 17. SSE2 tối ưu hóa mã
- 18. Tối ưu hóa điểm nổi biên dịch GCC
- 19. Tối ưu hóa trình biên dịch C++ của các đối số đã qua
- 20. Khi tối ưu hóa mã xảy ra?
- 21. Tối ưu hóa trình biên dịch của các loại vô danh
- 22. Tối ưu hóa hiệu suất của tôi
- 23. Mã C gọi mã lắp ráp (ví dụ: strlen được tối ưu hóa) như thế nào?
- 24. Tối ưu hóa Mã số
- 25. Trình biên dịch C/C++ hoạt động như thế nào?
- 26. Tôi làm cách nào để tối ưu hóa mã này?
- 27. Mã LINQPad biên dịch như thế nào?
- 28. Làm thế nào để đảm bảo rằng tối ưu hóa trình biên dịch không đưa ra nguy cơ bảo mật?
- 29. Làm cách nào để vô hiệu hoá tối ưu hóa trình biên dịch trong C#?
- 30. Cách biên dịch chương trình C mà không cần bất kỳ tối ưu hóa nào
Đây là ngày thứ hai của tôi trong stackoverflow, nhưng tôi thấy chủ đề tối ưu hóa const cho lần thứ ba đã ... Tại sao các lập trình viên bị ám ảnh với tối ưu hóa đặc biệt là khi trong nhiều trường hợp nó không cần thiết? Điều này nhất định là một sự lừa dối –
Câu hỏi rất thú vị. Hãy thử đọc http://en.wikipedia.org/wiki/Compiler_optimization –
@Armen: xin lỗi nếu câu hỏi của tôi gây khó chịu, nó chỉ là tò mò và không có nơi nào được tìm thấy trên mạng. –