2016-11-03 14 views
6

Cụ thể, tôi có một số chức năng ghi nhật ký Swift 3.0 bao bọc tất cả các câu lệnh của chúng trong một if chỉ thực thi khi một thao tác trên hai giá trị static const được kết nối từ ObjC có kết quả không đồng bộ.Làm thế nào tôi có thể thấy tối ưu hóa trình biên dịch áp dụng cho mã Swift của tôi?

func logStuff(_ message: @autoclosure() -> String) { 
    if a & b != 0 { 
     // log stuff here... 
    } 
} 

Biến ab được khai báo trong phần đầu cầu nối của tôi như thế này:

static const NSUInteger a = <some literal>; 
static const NSUInteger b = <some literal>; 

trình biên dịch sẽ bõ mẫu âm chót toàn bộ cuộc gọi đến logStuff() khi kết quả của a & b là zero và toàn tối ưu hóa mô-đun được kích hoạt?

Câu trả lời cụ thể cho câu hỏi này sẽ được đánh giá cao, nhưng một cách để dễ dàng xem những gì tối ưu hóa thực sự được áp dụng bởi LLVM trong mọi tình huống sẽ là lý tưởng.

+0

Bạn có thể loại ngắn mạch câu hỏi này hoàn toàn: tại sao không chỉ sử dụng một khuôn khổ đăng nhập được thành lập? – Alexander

+0

Đã sử dụng CocoaLumberjack. Đang cố gắng sao chép "khai thác gỗ hạt mịn" được mô tả [tại đây] (https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/Documentation/FineGrainedLogging.md) cho ObjC mà không bị ảnh hưởng đến hiệu suất trong sản xuất. – jbelkins

+0

Trình biên dịch có một vài công tắc sẽ cung cấp cho bạn kết quả sau các giai đoạn khác nhau, ví dụ: '-emit-assembly'. –

Trả lời

0

Nếu bạn xây dựng trình biên dịch Swift của riêng bạn bằng cách sử dụng LLVM của riêng bạn được biên dịch với thiết bị đo, bạn sẽ có thể đổ thông tin đó như được mô tả trong tài liệu LLVM Writing an LLVM Pass.

Tuy nhiên, các lần tối ưu hóa tương tác, có thể chạy nhiều lần và không phải lúc nào cũng làm những gì bạn mong đợi. Vì vậy, bạn nên làm tốt hơn để kiểm tra các trường hợp cụ thể mà bạn quan tâm về thực nghiệm và sau đó kiểm tra kết quả nhị phân.

Vì đó là chức năng ghi nhật ký và có thể dễ dàng kích hoạt động, một thay thế (có thể đơn giản hơn) để kiểm tra tĩnh đầu ra trình biên dịch sẽ chạy tệp thực thi dưới trình gỡ lỗi, đặt điểm ngắt trên hàm mà bạn mong đợi không được gọi và sau đó thực hiện một hành động trong tệp thực thi sẽ kích hoạt cuộc gọi nếu cuộc gọi chưa được tối ưu hóa.

Sau đó, lặp lại xác minh trong suốt thời gian tồn tại của ứng dụng, bởi vì trình biên dịch và mã nguồn tiếp tục thay đổi. (Hoặc quyết định rằng nó không phải là một mối quan tâm đáng kể đáng giá đó mức độ siêng năng.)

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