2010-03-06 40 views
8

Tôi có thể kiểm tra tối ưu hóa bằng cách sử dụng profiler, kích thước của tệp thi hành và thời gian thực hiện.cách xem mã được tối ưu hóa trong c

Tôi có thể nhận được kết quả tối ưu hóa. Nhưng tôi có các câu hỏi này,

  • Cách lấy mã C được tối ưu hóa.
  • Thuật toán hoặc phương pháp nào được C sử dụng để tối ưu hóa mã.

Xin cảm ơn trước.

Trả lời

11

bạn có thể có ý tưởng tối ưu hóa bằng cách sử dụng tùy chọn -fdump-tree-optimized với gcc. và bạn sẽ nhận được tệp được tối ưu hóa. bạn không thể chạy mã nhưng bằng cách sử dụng, bạn có thể có ý tưởng tối ưu hóa. đừng quên bao gồm -O2 hoặc -O3 hoặc một số cấp độ khác.

8

Thông thường mã không được tối ưu hóa như C. Thông thường, các thẻ tối ưu được thực hiện lâu sau khi C được chuyển đổi thành một dạng biểu diễn trung gian giúp trình biên dịch hoạt động dễ dàng hơn trong bộ nhớ. Do đó, câu trả lời trực tiếp cho câu hỏi của bạn là mã C tối ưu hóa không bao giờ tồn tại.

+0

vâng tôi có thể lấy mã lắp ráp bằng cách sử dụng lệnh objdump -s. và chúng tôi có thể sản xuất mã lắp ráp bằng cách sử dụng cc -S – sganesh

+0

Nhưng nếu tôi biết cách tối ưu hóa, tôi có thể cố gắng thực hiện tối ưu hóa của riêng mình – sganesh

+1

Tối ưu hóa C thực tế là không thể thực hiện một cách có ý nghĩa. Hầu hết các loại thuật toán phân tích tĩnh được thiết kế để hoạt động trên một số dạng mã "ba địa chỉ" đã được dịch bởi trình biên dịch. Thuật toán dễ viết hơn khi dữ liệu hoạt động đơn giản hơn. Bắt đầu với "cuốn sách rồng" và làm việc theo cách của bạn từ đó. (http://en.wikipedia.org/wiki/Dragon_Book_(computer_science)) –

7

Trình biên dịch C thường không tạo ra tối ưu hóa C ở bất kỳ giai đoạn nào. Thay vào đó, trình biên dịch biến C thành một biểu diễn nội bộ đơn giản hóa, và hầu hết các tối ưu hóa trình biên dịch sẽ được thực hiện trên one or more of those intermediate representations. Sau đó, trình biên dịch tạo ra lắp ráp hoặc một nhị phân từ đó.

Gần nhất bạn có thể nhận được có lẽ là biên dịch một tệp để lắp ráp mà không có tối ưu hóa và một lần nữa với tối ưu hóa cao nhất, và sau đó so sánh đầu ra lắp ráp. Bạn sẽ phải có một nắm bắt tốt về ngôn ngữ lắp ráp để làm điều đó. Nếu bạn đang sử dụng gcc, hãy đọc về các công tắc -S và -O để biết cách thực hiện (hoặc không thực hiện) điều này.

Nếu mục tiêu của bạn là viết mã nhanh hơn, thì tốt nhất là viết C tốt hơn bằng cách sử dụng thuật toán và cấu trúc dữ liệu tốt hơn ở cấp độ C bằng cách sử dụng profiler một cách cẩn thận.

Nếu mục tiêu của bạn chỉ là hiểu tối ưu hóa, hãy thử Program OptimizationCompiler Optimization trên Wikipedia để biết một số thông tin chung.

+0

+1 để kiểm tra lắp ráp. –

+0

Tôi chỉ sử dụng gcc. Tôi biết về -S và -O1, 2,3 cấp độ Nhưng tôi muốn biết phương pháp để tối ưu hóa một mã. Sau đó, chỉ có tôi mới có thể thử tối ưu hóa riêng của tôi – sganesh

+1

@sganesh: Sau đó, câu hỏi phải là: Làm thế nào tôi có thể bắt đầu viết một trình tối ưu hóa mã? Cố gắng đảo ngược kỹ sư những gì các trình biên dịch khác đang làm sẽ không giúp bạn. Nếu bạn muốn làm điều đó, chỉ cần nhìn vào mã nguồn của họ. –

-2

nếu bạn hiểu trình biên dịch, bạn có thể kiểm tra trình tạo mã được tạo bởi trình biên dịch.

+0

True - nhưng điều này thực sự không có gì để làm với câu hỏi của OP ... chưa kể đến vẹt câu trả lời của Jessie Mikkikan đó là 4 phút trước ... –

2

Nếu bạn đang sử dụng GCC, hãy sử dụng đối số để tối ưu hóa mã và sử dụng --save-temps làm đối số. Tất cả mọi người nói rằng mã C không được tối ưu hóa như C khi biên dịch với GCC là sai trong một phạm vi. Viết trình tạo chuỗi Fibonacci đệ quy trong C và đọc qua mã đã được xử lý trước. Đối số nói trên cũng tiết kiệm lắp ráp được tạo ra trong thư mục GCC được gọi từ. Nếu bạn cảm thấy thoải mái hơn với việc lắp ráp cú pháp của Intel, hãy sử dụng -masm = intel làm đối số.

+0

Trong gcc, --save-temps được sử dụng để lưu trữ các tập tin được xử lý trước . sử dụng -E chúng ta có thể thấy tập tin đó. Tuy nhiên, --save-temps sẽ lưu trữ tệp này vĩnh viễn. – sganesh

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