2013-05-23 3 views
3

Dart의 성능에 감명을 받았다. HTML5 캔버스를 사용하여 Dart에서 Mandelbrot을 렌더링하는 아주 간단한 웹 앱을 만들었다. 이는 현실적인 성능 테스트가 아니라는 의미입니다. 이 페이지는 Mandelbrot을 800x600 캔버스에 최대 깊이 10.000으로 렌더링합니다. 응용 프로그램은 여기에서 볼 수 있습니다 : http://goo.gl/DLuQpJS로 컴파일 된 다트 코드가 Dart보다 빠르다 (Dartium에서)

나에게 어떤 고통이 있습니까? Dartium에서 실행하면 이미지가 약 8.5 초 (인상적입니다) 렌더링됩니다. Firefox의 동일한 페이지에서 15 초를 초과합니다. 놀랍지도 않습니다.

그러나 Dart를 실행하지 않지만 JS 버전도 6.7 초 만에 완료되는 Chrome (버전 27.0.1453.93)에서 동일한 페이지를 실행하면 Dart보다 빠릅니다.

왜 그렇습니까?

업데이트 : 워밍업 동작을 확인하기 위해 캔버스를 다시 렌더링하기 위해 "실행"단추를 추가했습니다. 또한 Dartium에서 JS를 확인하기 위해 JS 전용 버전 (물론 동일한 코드)을 추가했습니다. 간단히 말해서, 수치와 나의 질문은 그대로입니다. 예열은 효과가없는 것 같습니다. JS 버전은 다트 버전보다 다트 버전에서 빠릅니다.

마감일 이후의 업데이트 :이 특별한 경우에는 코드를 병렬 작업자/격리 자로 옮기면 성능이 크게 향상 될뿐만 아니라 요인에 의해 JS 버전이 분명히 먼지에 남아있게됩니다. 10.

+1

그냥 추측이므로 여기에 답변 대신 대답이 나와 있습니다. Chrome은 JS 엔진을 많이 최적화했습니다. Dartium은 개발 도구입니다.이 경우에는 Dart VM이 디버깅 용으로 구성되어 있고 속도가 아닌 경우 놀라지 않을 것입니다. 또한 벤치 마크 결과 DartVM이 V8보다 빠르다고 보여 지지만 이는 일반적인 벤치 마크입니다. 일부 부품 (그래픽?)은 여전히 ​​V8에서 더 잘 최적화 될 수 있습니다. –

+0

"확인 모드"가 켜져있는 상태에서 Dartium을 실행 중입니까? 이렇게하면 런타임에 모든 유형을 표시 할 때 오버 헤드가 추가됩니다 (실행> 설정 확인). –

+0

Dartium에서도 js 버전을 테스트 해 보셨습니까? –

답변

5

캔버스 바인딩 및 API에 대해 알려진 문제입니다. http://dartbug.com/10344

+0

매우 흥미 롭습니다. 감사합니다! 내 프로그램의 최신 버전에서는 바인딩에 대한 호출을 제외합니다 (스톱워치는 픽셀이 그려지기 전에 중지되고 이후에 다시 시작됩니다). 이제 그 차이는 거의 없습니다. 하지만 JS는 조금 더 빨라지고 있습니다. – jramb

8

여러 가지 이유가있을 수 있습니다. 내 머리 꼭대기에서 :

  • 일부 최적화에서는 Dart VM이 누락됩니다. V8은 Dart-VM보다 훨씬 오래되었고 일부 최적화는 아직 Dart에 포함되지 않았습니다.
  • 예열 가동을 실행하고 있지 않습니다. Dart-VM은 현재 OSR (on-stack replacement)을 수행하지 않습니다. 함수가 호출되면 함수가 시작된 것과 동일한 "모드"로 완료됩니다. 즉, 중요한 기능이 최적화되지 않은 모드에서 시작되지만 실제로 중요한 루프가 포함되어 있으면 (오랫동안 실행되는 경우) Dart VM은 최적화 된 버전으로 교체하지 않습니다. 쉽게 해결할 수있는 방법은 먼저 함수를 (더 작은 값으로) 실행하여 함수가 최적화되도록하는 것입니다. 결국 OSR은 Dart VM으로 만듭니다.
  • 확인 모드에서 실행하지 마십시오. Dart-VM은 검사되지 않은 모드에서 훨씬 빠를 수 있습니다.
+0

감사합니다. Florian! 워밍업 최적화는 문제가되지 않습니다. 확인되지 않은 모드로 실행하려고합니다 (Dartedit의 스위치가 실제로 체크 모드를 해제하지 않는 것 같습니다 ...). 이것이 가장 합당한 설명입니다. – jramb