2012-07-31 19 views
8

Tôi đã nhìn vào các thư viện scala khai thác gỗ khác nhau thời gian gần đây, và phần lớn trong số họ thực hiện chức năng đăng nhập của họ nhưhiệu suất trong các thư viện scala logging gọi-by-value vs gọi bằng tên

def debug(s: => String) 

Vì vậy, nếu bạn đã gỡ lỗi đăng nhập tắt, nó sẽ không thực hiện tuyên bố. Tuy nhiên, tôi chỉ tình cờ gặp logula mà cụ thể khẳng định là một trong những lợi ích của nó

Không giống như rất nhiều các thư viện đăng Scala, Logula không sử dụng pass-by-tên ngữ nghĩa (ví dụ: f: => A) đối với các tuyên bố ghi nhật ký, có nghĩa là hai điều:

  • Trình biên dịch Scala không phải tạo các đối tượng đóng cửa một lần cho mỗi câu lệnh ghi nhật ký. Điều này sẽ làm giảm lượng rác thải áp lực thu gom.

Điều này thực sự có ý nghĩa với tôi. Vì vậy, câu hỏi của tôi là, có bất kỳ điểm chuẩn/dữ liệu hiệu suất thực tế nào so sánh 2 phương pháp tiếp cận không? Lý tưởng nhất là một cái gì đó từ một dự án trực tiếp so với các tiêu chí chuẩn bị?

Trả lời

8

Điều này phụ thuộc hoàn toàn hơn vào các trường hợp sử dụng. Nếu bạn đang đăng nhập các chuỗi tĩnh, thì sẽ nhanh hơn khi chuyển chuỗi liên tục đó vào và bỏ qua nó. Nếu không, nếu bạn đang tạo chuỗi, bạn phải tạo ít nhất một đối tượng. Các đối tượng chức năng rất nhỏ và rẻ - bạn nên tạo ra một trong những đối tượng đó hơn là chuỗi nếu bạn bỏ qua nó. Cá nhân, tôi nghĩ rằng sự hiểu biết nguyên tắc đầu tiên về sự cân bằng thậm chí còn có giá trị hơn nghiên cứu điển hình của một ứng dụng cụ thể có thể đã sử dụng cái này, vì nó cho phép bạn hiểu tại sao bạn chọn một hoặc người khác (và bạn vẫn sẽ luôn muốn chuẩn cho ứng dụng của riêng bạn).

(Lưu ý: cách tạo đối tượng đắt tiền phụ thuộc vào mức độ ảnh hưởng nặng nề của bộ thu gom rác, thường là các đối tượng sống ngắn có thể được tạo và xử lý theo thứ tự 10 mỗi giây không phải là một mối quan tâm ngoại trừ trong vòng thắt chặt bên trong. Nếu bạn đang đặt khai báo khai thác trong vòng bên trong chặt chẽ, tôi nghĩ rằng cái gì là sai. Bạn nên viết đơn vị kiểm tra cho rằng thay thế.)

+1

'Cá nhân, tôi nghĩ loại hiểu biết nguyên tắc đầu tiên về sự cân bằng này thậm chí còn có giá trị hơn nghiên cứu điển hình của một ứng dụng cụ thể' Trong khi tôi đồng ý với nguyên tắc ở đây, thực tế có thể là một con thú hoàn toàn khác với bạn dự đoán. Đó là lý do tại sao tôi đang tìm kiếm các trường hợp thực tế thay vì điểm chuẩn, bởi vì bất cứ ai cũng có thể viết một điểm chuẩn mà làm cho một cách nhìn nhanh hơn một triệu lần. Chủ yếu là vì sự tò mò của riêng tôi, bởi vì một cách trung thực, ứng dụng nào đang đăng nhập thực sự là nút cổ chai? – Falmarri

+0

@Falmarri - Nó có thể khác với bạn mong đợi _especially_ nếu bạn lý do từ ví dụ. Đó là lý do tại sao tôi giải thích sự cân bằng cơ bản. Tôi đồng ý rằng việc ghi nhật ký không phải là nút cổ chai trong hầu hết các ứng dụng. –

+0

@Falmarri Vâng ... bạn có đo lường mọi thứ không? Có những người thề bằng cách đo từng bước trong ứng dụng của họ, bao gồm kích thước hàng đợi, thông lượng và thời gian phản hồi.Nếu bạn đi tuyến đường đó, bạn không muốn đăng nhập của mình để thêm vào tổng thời gian. Trong thực tế, bạn muốn nó không đồng bộ. –

3

Tôi sẽ đi ra ngoài trên một chi và nói rằng các cuộc thảo luận triết học về sự cân bằng hữu ích hơn khi có một số sự cân bằng thú vị được thực hiện, đó là để nói, không phải ở đây.

class A { 
    var debugging = true 
    @inline final def debug(msg: => String) = if (debugging) println(msg) 

    def f = { debug("I'm debugging!") ; 5 } 
} 
% scalac292 -optimise a.scala 
% ls -l *.class 
-rw-r--r-- 1 paulp staff 1503 Jul 31 22:40 A.class 
% 

Đếm đối tượng đóng.

+1

Rất tốt để biết! Mặc dù có thể khó khăn hơn để đạt được elision nếu bạn đang cố gắng sử dụng phương thức log của thư viện bên ngoài để thực hiện việc ghi nhật ký ... nhưng điều này chỉ cho rằng bạn nên có '@inline final def debug' của riêng mình trong gói thư viện ở những nơi bạn cần. –

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