랜드 마크는 OCAML을위한 간단한 프로파일 링 라이브러리입니다. 코드의 일부를 구분하고 런타임에 계측 코드의 성능을 측정하는 프리미티브를 제공합니다. 이용 가능한 조치는 CPU 사이클 (CPU 타임 스탬프 카운터 사용), 적용 시간 ( Sys.time
사용) 및 할당 된 바이트 ( Gc.allocated_bytes
)를 집계함으로써 얻을 수 있습니다. 코드의 계측은 PPX 확장을 사용하여 손으로, 자동 또는 반자동으로 수행 할 수 있습니다.
프로그램을 실행하는 동안 제어 흐름에 의한 계측 코드의 통과는 수집 된 측정을 전달하는 "콜 그래프"로 기록됩니다. 결과는 콘솔에서 직접 탐색하거나 JSON으로 내보낼 수 있습니다.
이 도구는 프로그램에서 시간이 소요되는 위치 (Core_Bench와 같은 독립 코드 조각이 아닌)를 찾는 동시에 OCAML 코드의 계기 부분에 해당하는 결과를 제공하는 방법으로 사용됩니다 (도구와 반대로 GPROF 또는 PERF와 같은 이진 실행 파일과 직접 작동합니다).
자세한 내용은 API를 탐색 할 수 있습니다.
라이브러리는 런타임 라이브러리의 landmarks
와 자동 계측기 구현 전처리기를위한 landmarks-ppx
두 가지 패키지로 나뉩니다.
opam install landmarks
또는
opam install landmarks-ppx
런타임 라이브러리 또는 런타임 라이브러리 및 사전 처리기 모두를 설치합니다.
git clone https://github.com/LexiFi/landmarks.git
cd landmarks
dune build @install
라이브러리 landmarks
와 사전 처리기 landmarks-ppx
사용하여 실행 파일과 라이브러리를 벤치마킹하기 만하면됩니다. 예를 들어, 다음 dune
파일은 landmarks
마크 라이브러리와 PPX를 사용하여 실행 파일 test
구축합니다. 선택 사항 --auto
자동 계측기를 켜십시오 (아래 참조).
(executable
(name test)
(libraries landmarks)
(preprocess (pps landmarks-ppx --auto))
)
모래 언덕을 사용하여 프로젝트의 계측을 자동으로 트리거 할 수 있습니다. 기본 예제는 Lexifi/Landmarks-Starter를 살펴보고 자세한 내용은 Dune 매뉴얼을 참조하십시오.
ocamlfind ocamlopt -c -package landmarks prog.ml
ocamlfind ocamlopt -o prog -package landmarks -linkpkg prog.cmx
"OCAMLC"로 "OCAMLOPT"를 교체하여 바이트 코드에서 프로그램을 컴파일 할 수 있습니다.
ocamlfind ocamlopt -c -package landmarks -package landmarks-ppx -ppxopt landmarks-ppx,--auto prog.ml
ocamlfind ocamlopt -o prog -package landmarks -linkpkg prog.cmx
"-ppxopt landmarks-ppx, -Auto"는 선택 사항이며 자동 계측기를 켭니다.
세 가지 주요 프리미티브가 있습니다.
val register : string -> landmark
val enter : landmark -> unit
val exit : landmark -> unit
register
함수는 새로운 랜드 마크를 선언하고 대구에서 사용해야합니다. enter
및 exit
함수는 랜드 마크에 첨부 된 코드 부분을 구분하는 데 사용됩니다. 프로파일 링의 끝에서, 우리는 각 랜드 마크에 대해 해당 코드를 실행하는 데 소비 된 집계 시간 정보를 검색합니다. 실행하는 동안 "콜 그라프"를 구축하기 위해 방문한 각 랜드 마크의 흔적도 기록됩니다.
예를 들어:
open Landmark
let loop = register " loop "
let sleep = register " sleep "
let main = register " main "
let zzz () =
enter sleep;
Unix. sleep 1 ;
exit sleep
let () =
begin
start_profiling () ;
enter main;
enter loop;
for _ = 1 to 9 do
zzz ()
done ;
exit loop;
zzz () ;
exit main;
end
(이 파일은 ocamlfind ocamlc -o prog -package landmarks -package unix -linkpkg prog.ml
로 컴파일 될 수 있습니다.
유도 된 콜 그래프는 다음과 같습니다.
- 100.00% : main
| - 90.00% : loop
| | - 100.00% : sleep
| - 10.00% : sleep
다음과 같이 말할 수 있습니다.
clock()
함수 이 라이브러리는 X86 32 및 64 비트 아키텍처에 대한 고성능주기 카운터에 대한 결합을 제공합니다 ( landmarks-noc.cm(x)a
사용하여 자체 구현을 제공 할 수 있음). 계측 코드 내부에서 소요되는 시간을 측정하는 데 사용됩니다.
보일러 플레이트 코드를 쓰지 않으려면이 패키지와 함께 배포 된 PPX 확장자를 사용할 수 있습니다. 이를 통해 프로그래머는 주석을 사용하여 기기 표현식과 상단 수준 기능을 자동으로 계측 할 수 있습니다.
value expr [@landmark "name"]
가 확장됩니다
Landmark. enter __generated_landmark_1;
let r =
try expr with e -> Landmark. exit __generated_landmark_1; raise e
in
Landmark. exit __generated_landmark_1;
r
그리고 선언
let __generated_landmark_1 = Landmark. register " name "
최상위로 추가됩니다.
이 변형은 꼬리 추방 전화를 보존하지 않고 일부 다형성 일반화를 방지한다는 점을 지적해야합니다. 이러한 문제를 해결하려면 let ... in
and let rec ... in
:
let [ @ landmark] f = body
확장됩니다.
let __generated_landmark_2 = Landmark. register " f "
let f = body
let f x1 ... xn =
Landmark. enter __generated_landmark_2;
let r =
try f x1 ... xn with e -> Landmark. exit __generated_landmark_2; raise e
in
Landmark. exit __generated_landmark_2;
r
f
의 Arity n
fun ... ->
function ... ->
body
에서 얻을 때. LET-REC 바인딩과 함께이 주석을 사용할 때는 입장 포인트 호출 만 기록됩니다. 예를 들어, 다음 코드에서
let () =
let [ @ landmark] rec even n = (n = 0 ) || odd (n - 1 )
and [ @ landmark] odd n = (n = 1 ) || n > 0 && even (n - 1 )
in Printf. printf " 'six is even' is %b n " (even 6 )
"심지어"와 관련된 랜드 마크는 정확히 한 번 (그리고 3 번은 아님)로 이동하는 반면, 제어 흐름은 "홀수"와 관련된 랜드 마크를 통과하지 않습니다.
구조 주석 [@@@landmark "auto"]
및 [@@@landmark "auto-off"]
는 모듈에서 최상위 기능의 자동 계측을 활성화하거나 비활성화합니다. 자동 모드에서는 모든 기능 선언이 암시 적으로 주석이 달성됩니다. 아래에 자세히 설명 된 것처럼 OCAML_LANDMARKS
의 옵션 auto
을 통해 모든 파일에 자동 계측을 활성화/비활성화 할 수 있습니다.
환경 변수 OCAML_LANDMARKS
PPX 재 작성자가 실행될 때와 랜드 마크 모듈이 계측 프로그램에 의해로드 된 경우 두 가지 단계에서 읽습니다. 이 변수는 양식 option=argument
또는 option
의 쉼표로 구분 된 항목 목록으로 구문 분석됩니다. 여기서 option
다음과 같습니다.
PPX 재 작성기 단계에서 (컴파일 시간에) :
auto
(인수 없음) : 기본적으로 자동 계측기를 켭니다 (각 모듈은 주석으로 시작하는 것처럼 작동합니다 [@@@landmark "auto"]
.
threads
(인수 없음) : 모듈 Landmark
대신 Landmark_threads
모듈을 사용하도록 PPX 확장자에게 알려줍니다.
계측 프로그램을로드 할 때 (런타임에) :
가능한 인수가있는 format
: textual
(기본값) 또는 json
. 콘솔 친화적 표현 또는 콜 그라프의 JSON 인코딩 인 프로파일 링의 출력 형식을 제어합니다.
인수로 0.0에서 100.0 사이의 숫자 인 threshold
(기본값 : 1.0). 임계 값이 0이 아닌 경우 텍스트 출력은이 임계 값 아래의 콜 그라프에서 노드를 숨 깁니다 (부모의 시간의 백분율). 이 옵션은 다른 형식의 경우 의미가 없습니다.
가능한 인수가있는 output
: stderr
(기본값), stdout
, temporary
, <file>
(여기서 <file>
은 파일의 경로입니다). 프로파일 링 결과를 출력 할 곳을 알려줍니다. temporary
로 임시 파일로 인쇄합니다 (이 파일의 이름은 표준 오류에 인쇄됩니다). 또한 temporary:<directory>
사용하여 파일이 생성되는 디렉토리를 지정할 수도 있습니다.
논쟁없이 debug
. 랜드 마크 프리미티브가 호출 될 때마다 stderr의 추적을 출력하는 장점 모드를 활성화합니다.
논쟁이없는 time
. 또한 프로파일 링 중에 Sys.time
타임 스탬프를 수집하십시오.
논쟁 off
. 프로파일 링을 비활성화합니다.
논쟁 on
. 프로파일 링 활성화 (기본값; 생략 될 수 있음).
논쟁없이 allocation
. 또한 Gc.allocated_byte
데이터를 수집하십시오.
컴퓨터에서 웹 뷰어를 컴파일하거나 온라인으로 탐색 할 수 있습니다. Filepicker를 사용하여 JSON 파일을로드 한 다음 클릭하여 CallGraph를 탐색 할 수 있습니다.
Landmark
모듈은 스레드 안전이 아닙니다. 여러 스레드가있는 경우 최대 한 스레드가 계측 코드를 실행하고 있는지 확인해야합니다. 이를 위해 Landmark_threads
모듈 (Landmarks-Streads.cm에 포함 된 아카이브)을 사용할 수 있습니다.
표현에 대한 주석은 다형성으로 화를 낼 수 있습니다 (이것은 let 바인딩 주석의 경우가 아닙니다). 예를 들어, 다음 코드가 컴파일되지 않습니다.
let test = ( fun x -> x)[ @ landmark " test " ]
in test " string " , test 1
이 '랜드 마크'패키지는 Lexifi가 MIT 라이센스의 조건에 따라 라이센스를 부여합니다.
연락처 : [email protected]