2017-12-26 10 views
1

새로운 Spiral language에 대한 자습서를 만드는 중이며 흥미로운 성능 퍼즐을 발견했습니다. 내가 뭘 하려는지는 this chapter에서 볼 수 있으며 생성 된 두 프로그램은 boxyfully_specialized입니다. 그들이하고있는 일은 문자열에서 3 정수를 읽고 튜플로 반환하는 것입니다. 놀랍게도 boxy 버전은 완전히 전문화 된 버전보다 13 배 (일부 실행에서는 최대 20x) 빠릅니다. 타이밍은 스크립팅 및 컴파일 모드에서 유사하므로 Repl에서 테스트하는 것이 쉬워야합니다.파서의 박스형 버전이 완전히 전문화 된 버전보다 13 배 빠릅니다. 왜 그렇습니까?

해체를 시도하기 전에 분해가 일어나기 전에 여러 가지 아이디어가 있습니다.

1) 코드 풋 프린트가 작기 때문에 캐시 위치가 개선되었습니다. 나는 이것이 다른 예가 아닌 비슷한 종류의 개선을 보게 될 것이라고 생각합니다.

2) JIT에서 수행 한 흑 마법.

3) 벤치마킹에 문제가 있습니다.

내가 말할 수있는 한 프로그램이 잘 작동하는 것 같고 눈에 띄는 부분은 박스형 버전에 맞지 않습니다.

어떤 일이 벌어지고 있는지에 대한 아이디어가 있습니까?

+6

생성 된 코드를 해독하는 데 시간이 걸릴 가능성은 거의 없습니다. 두 가지 예를 최소한으로 재현 할 수있는 형태로 줄이는 것이 좋습니다. 보너스로,이 작업을 수행하는 동안 불일치의 원인을 발견 할 수 있습니다. –

+1

당신의 충고를 받아 들일 것입니다. 내가 이것을 게시하면 무언가가 떠오를 것으로 생각했다. 보통 이런 식으로 생각하면 내가 놓친 바보 같은 것으로 밝혀졌지만 지금은 그렇게 느껴지지 않습니다. F #의 최적화 프로그램과 관련이 있을지 궁금합니다. 빨리? 프로그램은 실제로 작동합니다. –

답변

1
  Method |  Mean |  Error | StdDev | 
----------------- |-----------:|----------:|----------:| 
     TermCasted | 406.6 ns | 1.2316 ns | 1.1520 ns | 
      Boxy | 199.4 ns | 0.9976 ns | 0.9332 ns | 
FullySpecialized | 292.8 ns | 0.8448 ns | 0.7902 ns | 
      FSharp | 3,616.2 ns | 8.9547 ns | 8.3762 ns | 

적절한 스크립트 대신 benchmarking tool을 사용하면 이해가 잘되는 수치를 얻습니다. boxy와 완전히 전문화 된 것의 차이는 현재 1300 %가 아니라 45 %입니다. 이 수치는 기대하는 것과 훨씬 더 일치합니다.

나선형 파서는 F #보다 훨씬 빠른 속도로 예상되는 속도입니다. 자세한 내용은 자습서의 구문 분석 장 (master)을 확인하십시오.

이 교훈은 여러분 자신이 심각하게 벤치 마크하지 않은 것입니다. 나는 이것을 여기에서 가슴으로 가져갈 생각이다.

관련 문제