2011-10-25 4 views
4

이 좋아 어쩌면 여기 바보 같은 질문,하지만 난 현재 projecteuler.net지수 연산자 성능

나는 흥미로운 관찰로 실행

의 문제를 완료하여 하스켈을 배우고 사물들이 길을 왜 누군가가 되거 수있는 기대했다 아르. 참고로

, 나는 Problem #29 여기 내가이 ^^ 연산자를 사용하여 위의 입력 ^보다 빠릅니다하는 빠른 **보다 것을 관찰

nub $ [ a^^b | a <- [2..100], b <- [2..100] ] 

등장 무엇을 구현했다.

제 질문은 간단합니다. 이유가 무엇입니까? 이 연산자는 각각 다른 유형 클래스에 적용됩니다. 내 생각 엔 몇 가지 유형 변환이 일어나고 있지만 실제로는 oposite 인 것 같으면 ^이 더 빨리 작동 할 것으로 기대합니다.

감사합니다.

+1

목록이 (가하지 않은) 매우 짧은 아닌 경우는, 덩어리를 사용하지 않습니다. 그것은 O (n은^2)입니다. –

+3

하스켈에는 유형 변환이 없습니다. –

답변

4

항상 nub에 소요됩니다. ^^**을 사용하면 nub[Double]에 게시합니다. ^의 경우 [Integer]nub이고 큰 정수를 비교하는 것은 double을 비교하는 것보다 느립니다.

+0

이 예제에서 모든 작업을 수행하고 있습니다. – Jake

4

**^^은 이지만, ^Integer을 사용하고 있습니다. 부동 소수점 연산을 큰 정수 함수와 비교할 수는 없습니다. implementation of ^을 살펴보세요. 다음 코드에서

은 해당 :

  • **는 하드웨어로 구현된다.
  • ^은 꼬리 재귀 루프에서 큰 Integer을 사용합니다.
  • ^^Double을 제외하고는 동일합니다.

따라서 상대적인 성능에 대한 관찰이 이치에 맞습니다.

1

Project Euler 문제를 해결하는 동안 발견 한 점은 유형이 런타임 성능에 큰 차이를 만들 수 있다는 것입니다. 예 :

foo :: Integral a => a -> a 
foo' :: Integer -> Integer 
foo'' :: Int -> Int 

모두 성능이 매우 다릅니다. 놀랍게도 컴파일러가 foo에 대한 가장 일반적인 유형을 직접 지정하는 대신 성능 저하의 원인이된다는 것을 발견했을 때 놀랍습니다.

성능 또한 (분명히) 환경에 크게 의존합니다. 컴파일 또는 해석을 실행하고 있습니까? 최적화되었거나 최적화되지 않았습니까? 요점은 어떤 상황에서는 박스형이 아닌 힙 할당 값보다 덮개 아래에 unboxed 프리미티브 Int#을 가질 수 있다는 것입니다. 불행히도 여러분이 얻을 수 있을지 모를 n00b 자신만으로도 충분합니다 한 대기타 :(

GHC를 사용하고 있고 C 프로그래밍에 익숙하다면 -keep-hc-files 플래그를 사용하여 ^을 사용할 때 생성 된 중간 C 코드를 비교해보십시오. . ^^**.

+0

컴파일러가 Ints가 엄격하게 필요하다고 판단되면 Int #을 얻을 수 있습니다. 폭탄 패턴을 도울 수 있지만 코어를 확인하십시오. 당신은 그들을 얻었고 그것이 정말로 도움이되는지를 측정합니다. 또 다른 참고 사항은 .hc 파일은 등록되지 않은 컴파일러 (사용자 안내서 참조)에서만 생성되므로 대부분의 경우 컴파일러가 없기 때문입니다. –