2012-07-31 4 views
8

내가 최근 다양한 스칼라 로깅 도서관에서 찾아 봤는데 대, 그 중 대부분 그들의 로깅 기능을 구현성능 통화 가치에 의해 호출에 의해 이름

def debug(s: => String) 

따라서 디버그 로깅을 해제 한 경우 명령문을 실행하지 않습니다. 그러나, 나는 그냥 특별히 스칼라 로깅 라이브러리의 많은, Logula는 사용하지 않습니다 달리

그 혜택 중 하나로 상태 logula 건너 온 패스별로 이름 의미 (예를 들어, F => A)

  • 는 스칼라 컴파일러는 각 로깅 문에 대한 일회성 폐쇄 개체를 만들 필요가 없습니다 : 그 진술을 로깅을위한 하는 두 가지를 의미한다. 이것은 쓰레기 양을 줄이기 위해 수거 압력.

실은 저에게 완전히 합당한 것입니다. 그래서 내 질문은 거기에 어떤 실제 성능 벤치 마크/데이터가 두 가지 접근법을 비교 무엇입니까? 이상적으로 살아있는 프로젝트와 인위적인 벤치 마크의 무언가? 빠른

답변

8

사용 사례에 전적으로 의존한다. 정적 문자열을 로깅하는 경우 해당 상수 문자열을 전달하고 무시하는 것이 더 빠릅니다. 그렇지 않으면 문자열을 만드는 경우 어쨌든 하나 이상의 객체를 만들어야합니다. 함수 객체가 작고 저렴 - 당신이 그것을 무시하려고하는 경우 문자열보다는 그 중 하나를 만드는 더 나을 누구 요.

개인적으로, 이런 종류의 제 1 원리 이해는 왜 하나 또는 둘 중 하나를 선택할 지 이해할 수 있기 때문에 하나 또는 다른 것을 사용했을 수있는 특정 응용 프로그램의 사례 연구보다 훨씬 가치 있다고 생각합니다. 다른 (그리고 당신은 여전히 ​​자신의 응용 프로그램을 벤치마킹하려고합니다).

(참고 : 비싼 개체 생성은 가비지 수집기에 큰 영향을 미칩니다. 일반적으로 수명이 짧은 개체는 초 당 1의 순서로 생성 및 처리 할 수 ​​있습니다. 꽉 내부 루프를 제외하고 우려해서는 안됩니다. 당신이 꽉 내부 루프에서 로깅 문을 넣어하는 경우, 내가 뭔가 잘못 생각합니다. 당신은 대신에 대한 단위 테스트를 작성해야합니다.)

+1

'개인적으로, 이러한 종류의 제 1 원리 이해는 특정 응용 프로그램의 사례 연구보다 훨씬 가치가 있다고 생각합니다. 여기서 원칙에 동의하는 동안 현실은 당신과 완전히 다른 짐승이 될 수 있습니다. 앞질러 하다. 내가 대신 벤치 마크의 실제 사례를 찾고 있어요 왜 사람이 한 방향으로 빠르게 만 번을 보이게 벤치 마크를 쓸 수 있기 때문,이다. 내 호기심 때문이죠. 솔직히, 어떤 응용 프로그램이 병목 현상을 실제로 로깅하고 있습니까? – Falmarri

+0

@Falmarri는 - 당신이 예에서 당신이 경우 이유를 _especially_ 예상보다 다를 수 있습니다. 이것이 내가 기본적인 절충점을 설명한 이유입니다. 로깅은 대부분의 응용 프로그램에서 병목 현상이되어서는 안된다는 것에 동의합니다. –

+0

@Falmarri 음 ... 모든 것을 측정합니까? 대기열 크기, 처리량 및 응답 시간을 포함하여 애플리케이션의 모든 단계를 측정하여 맹세 한 사람들이 있습니다.해당 경로로 이동하면 로깅을 총 시간에 추가하지 않아도됩니다. 사실, 비동기 적이기를 원합니다. –

3

내가 나갈거야 사지와이 여기 없어,라고하는 것입니다 할 수있는 몇 가지 흥미로운 트레이드 오프,있을 때 장단점에 대한 철학적 논의가 더 유용 것을 말한다.

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 
% 

클로저 개체를 센다.

+1

알아두면 좋은 정보! 로깅을하기 위해 외부 라이브러리의 로그 메소드를 사용하려고한다면 elisation을 얻기가 더 어려울 지 모르지만, 이것은 라이브러리 호출을 래핑하는 자신의 로컬 '@inline final def debug'를 가져야한다고 주장합니다 당신이 필요로하는 곳에서. –

관련 문제