2013-06-12 28 views
6

Mã Vala được tạo có được tối ưu hóa như mã C viết tay bình thường không? Có bất kỳ chi phí hiệu năng nào trong việc sử dụng hệ thống GObject không sử dụng nó không?Tối ưu hóa bao nhiêu là mã C được tạo ra trên mã C bằng tay?

LƯU Ý: Trong dự án C tiếp theo của tôi, tôi đang nghiên cứu để sử dụng Vala hay không. Dự án không phải là một ứng dụng GUI, nó là một loại trình thông dịch ứng dụng phải là nền tảng độc lập. Tôi đang sử dụng gcc như trình biên dịch.

Trả lời

10

Là nhà phát triển Vala, tôi sẽ không đề xuất Vala cho thông dịch viên. Trong một thông dịch viên, bạn sẽ tạo ra nhiều đối tượng cho ast, kiểu dữ liệu, đối tượng trung gian có thể, đối tượng codegen và vv. Trong bản thân Vala, cá nhân tôi đã đo được rằng chi phí chính là tạo ra các đối tượng (đơn giản là GTypeInstance, thậm chí không phải GObject). Vala được thiết kế để làm việc với gobjects, nhưng gobjects không được thiết kế để được phân bổ nhanh. Vì vậy, đối với dự án của bạn, tôi vẫn đang sử dụng glib/gio cho các công cụ đa nền tảng, như mạng, chuỗi util, unicode, cấu trúc dữ liệu, v.v ... vì chúng có API sạch, nhất quán và thuận tiện, nhưng Tôi sẽ không tạo ra vật thể ast như gobjects/gtypeinstance. Trong một thông dịch viên bạn muốn phân bổ nhanh, đó là toàn bộ vấn đề.

Lời khuyên cá nhân của tôi là: sử dụng vala nếu bạn muốn xây dựng các ứng dụng dành cho máy tính để bàn, dịch vụ dbus, công cụ gstreamer hoặc bất kỳ thứ gì chạm vào thế giới g *, không có gì khác.

2

Mã được tạo không bao giờ được tối ưu hóa như mã viết tay được thiết kế tốt bởi vì trình tối ưu hóa không thể biết mục tiêu thiết kế. Tuy nhiên, một trình tối ưu hóa tạo mã được tối ưu hóa nhất quán hơn sau đó một lập trình viên của con người sẽ làm. Ngoài ra, bạn nên xác định mục tiêu của mình và sau đó kiểm tra xem các yêu cầu hiệu suất có được đáp ứng bởi các công cụ được chọn hay không, không phải theo cách khác. Tối ưu hóa không phải là một mục tiêu thiết kế, đó là một nhiệm vụ có thể cần phải được nhấn mạnh, vì vậy đầu tiên xác định yêu cầu của bạn và sau đó suy nghĩ về cách tiếp cận nó.

Tối ưu hóa sớm là gốc rễ của mọi điều ác. :)

+0

Tôi đã có ý tưởng thô về các yêu cầu. Ứng dụng này là một trình thông dịch tầm thường, phải là nền tảng độc lập và có thể thực hiện các giải thích nhanh chủ yếu trên các phép toán. Bây giờ bằng cách sử dụng GObject sẽ phải chịu bất kỳ hiệu suất trên không hay không là mối quan tâm chính của tôi trong câu hỏi. –

+0

Nếu bạn sử dụng các đối tượng, luôn luôn có một chi phí liên quan. Bạn cần hiệu suất thuần túy, viết nó trực tiếp có thể tốt hơn. Tất nhiên, luôn luôn có sự giao dịch của tốc độ so với sự duy trì và trong trường hợp của bạn cũng là vấn đề phụ thuộc nền tảng. Nếu không biết các yêu cầu thì thật khó để đưa ra một gợi ý. Ngoài ra còn có vấn đề thường xuyên được gọi là thông dịch viên. Nếu bạn liên tục tải một quy trình để làm việc trên một số tập dữ liệu nhỏ, chi phí tải quá trình có thể dễ dàng phá hủy bất kỳ tối ưu hóa hiệu suất nào trong mã. – Devolus

+0

Câu hỏi không phải là về "một mã được viết tay được thiết kế tốt"; đó là về Vala vs C. Vala tạo ra C, mà không phải là ngôn ngữ lắp ráp. –

5

Nó phụ thuộc vào những gì bạn đã có thể làm văn bản C. Đặc biệt:

  • Kể từ khi tôi có thể viết GObject dựa trên mã C bằng tay, ngưỡng của bạn là gì? Viết tay dựa trên GObject C so với C dựa trên văn bản GObject dựa trên C? Có thể so sánh được vì Vala sẽ tạo ra nhiều hoặc ít hơn các cuộc gọi thư viện giống như một con người.
  • Các lớp GObject về mặt kỹ thuật là tùy chọn. Bạn có thể đánh dấu một lớp là [Compact] để bỏ qua tất cả việc tạo mã GLib cho một lớp, sẽ nhanh hơn nhiều, mặc dù bạn sẽ mất nhiều tính năng, chẳng hạn như các phương thức ảo, nếu bạn làm như vậy. Điều này vẫn sẽ có chi phí cao hơn một chút so với một đối tượng được viết bằng C, nhưng nó đi kèm với đếm tham chiếu thread-safe và một vài thứ khác mà một lập trình viên C điển hình sẽ không làm phiền.
  • Vala tạo ra nhiều biến tạm thời. Nếu trình biên dịch C của bạn có tối ưu hóa, hầu hết các thời gian này sẽ bị loại bỏ. Phần lớn các cấu trúc điều khiển của Vala phù hợp với các bộ phận đếm C của chúng, vì vậy một Vala if sẽ không gây sốc đắt hơn C if.
  • Vala theo dõi tham chiếu để thực hiện quản lý bộ nhớ tại thời gian biên dịch. Thông thường, đây là giá rẻ, nhưng nó có thể gây ra sự sao chép thêm các mảng và chuỗi. Đặc biệt, nếu bạn sao chép một chuỗi không được công nhận thành một biến thuộc sở hữu, strdup sẽ tự động được gọi. Điều này có nghĩa là tạo ra Vala sẽ tạo ra nhiều hơn các đối tượng nhỏ, tạm thời này, nhưng, nếu nó thực sự là một vấn đề, bạn có thể sử dụng một cách khôn ngoan unowned để hạn chế việc tạo ra chúng.
+0

Đó là một cái nhìn sâu sắc tốt .. Cảm ơn :) –

+1

Tôi nên chỉ ra một nơi mà Vala và C khác nhau về chi phí là dây: kể từ '==' trên chuỗi trong kết quả Vala trong 'strcmp', nó chi phí một chút hơn. Sau đó, một lần nữa, bạn phải làm 'strcmp' trong C anyway; nó chỉ không hiển nhiên khi bạn đọc mã. – apmasell

2

Mã được tạo bằng trình biên dịch vala sử dụng thư viện GObject. Trong trường hợp nó là cần thiết để tránh GObject, tôi đề nghị sử dụng trình biên dịch aroop trong đó sử dụng phân tích cú pháp vala để phân tích mã vala nhưng không sử dụng GObject trong mã được tạo ra.

Aroop trình biên dịch tạo mã sử dụng nhóm đối tượng được tối ưu hóa để tạo và thao tác đối tượng. Bộ sưu tập các đối tượng có các tính năng định hướng dữ liệu. Ví dụ các đối tượng có thể được gắn cờ và cờ có thể được chọn trong khi duyệt qua các đối tượng theo một cách rất hiệu quả và các đối tượng đều ở khoảng cách gần trong phối cảnh vị trí bộ nhớ.

Trình biên dịch aroop được sử dụng để viết dự án shotodol không có GUI của riêng nó. Nó có hệ thống module và plugin. Nó có một giao diện dòng lệnh cho phép mọi người viết ứng dụng máy chủ. Một ví dụ về ứng dụng máy chủ sử dụng shotodol tồn tại ở đây là shotodol_web. Tôi muốn những người thích dự án này chia sẻ các vấn đề của họ trong số project page.