7

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?

+2

Đâ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 –

+0

Câu hỏi rất thú vị. Hãy thử đọc http://en.wikipedia.org/wiki/Compiler_optimization –

+0

@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. –

Trả lời

9

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.

+0

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. –

+0

@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

+0

@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. –

5

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ớ/

+1

Đ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 –

+4

Mã ví dụ của bạn phải làm gì khi truy cập đĩa? – JeremyWeir

+4

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. –

-3

Các quy tắc tối ưu hóa:

  1. Đừng làm điều đó
  2. 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ù.

+2

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

+0

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ó. –

+0

@ DerKuchen: vâng, đó là về cả hai. –

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