2009-10-04 4 views
27

저는 하스켈을 처음 접했고 주어진 함수 호출이나 코드 스 니펫의 런타임을 할 수 있기를 바랍니다.하스켈에서 시간 함수 작성하기

는 Clojure에서 나는 'time'를 사용할 수 있습니다

스칼라에서
user=> (time (apply * (range 2 10000))) 
"Elapsed time: 289.795 msecs" 
2846259680917054518906413212119868890148051... 

, I 함수에게 자신을 정의 할 수 있습니다

scala> def time[T](code : => T) = { 
    | val t0 = System.nanoTime : Double 
    | val res = code 
    | val t1 = System.nanoTime : Double 
    | println("Elapsed time " + (t1 - t0)/1000000.0 + " msecs") 
    | res 
    | } 
time: [T](=> T)T 

scala> time((1 to 10000).foldLeft(1:BigInt)(_*_)) 
Elapsed time 274.292224 msecs 
res0: BigInt = 284625968091705451... 

을 내 스칼라 함수 또는 Clojure의의 '에 해당 쓰기 수있는 방법 하스켈에서 '시간'? Hackage에서 발견 한 System.TimeIt module은 IO 계산이 측정되는 경우에만 작동하기 때문에 일반적으로 충분하지 않습니다. 따라서 timeIt(4 + 4)은 작동하지 않으며, 단지 성가신 고속이되는 timeIt(print $ 4 + 4) 만 작동합니다. 게다가, 나는 하스켈이 일반적인 경우를 다루는 방법을 정말로보고 싶다.

감사합니다.

답변

22

이에 대한 표준 라이브러리를 사용하여보고하십시오 :

그냥 기준을 사용 .


평가 깊이에 대한 참고 사항 : 게으름은 당신이 당신의 타이밍 실행 중에 갖고 싶어 얼마나 많은 평가 결정해야 의미합니다. 일반적으로 코드를 일반 형식으로 줄이기를 원할 것입니다. NFData typeclass를 사용하면 rnf 메서드를 통해이 작업을 수행 할 수 있습니다. 가장 바깥 쪽 생성자에 대한 평가가 괜찮 으면 순수 코드에 seq을 사용하여 평가를 수행하십시오.

+0

위키 항목은 내가 필요한 것입니다. 감사합니다! – dimo414

+0

+1 +1 : 브라이언 오 설리반 (Bryan O'Sullivan)의 블로그에 또 다른 +1이옵니다 :) – CoR

6

하스켈은 느리게 평가됩니다. 표현식에 (IO 모나드에서 인코딩 된 것과 같은) 부작용이없는 경우에는 프로그램에서 실제로 표현식을 값으로 해석 할 필요가 없으므로 그렇지 않습니다.

의미있는 숫자를 얻으려면 print 4print expr을 시도해보고 차이점을 알아내어 문자열 형식 및 IO의 오버 헤드를 제거하십시오.

5

게으른 의미는 게으름을 의미합니다. 시간은 IO와 같은 모나드 내부에서만 관련이 있습니다.

시간은 "4 + 4"표현 또는 다른 수학적 표현에서 의미가 없습니다. 대답은 간단합니다. 다른 순수한 계산에 대한 "응답"은 이미 계산이 지정되는 순간에 미리 결정됩니다.

불행히도, 이것은 귀하의 질문에 대한 "대답"입니다. 실제로 당신이 질문하기 전에 심지어 존재했던 대답입니다. 언어가 마침내 정의 된 1998 년에 존재했습니다. 이 글을 쓰는데 1 년이 걸린 사실은 중요하지 않습니다 ;-)

OK, 그 말도 안돼 !! (위의 내용이 너무 성가신 경우에는 하스켈을 잊어 버리십시오.)

Criterion 패키지가 너무 많은 경우에는 테스트 케이스를 작성하고 + RTS를 사용하여 테스트하십시오.

정말 멋지다 싶다면 자신 만의 모나드를 만드십시오. 모나드는 알고리즘 실행 시간에 맞춰 알고리즘 결과 값을 반환합니다. 행운을 빕니다. 우리는 모두 당신을 믿고있어!

+1

그러나 '4 + 4'는 실제로 입력이 필요없는 함수가 아닙니다. 이제 \ x -> x + 4는 함수입니다. 'x'의 값은 무엇이든 될 수 있습니다. 문제는 x가 알려진 시간으로부터 함수의 결과가 알려질 때까지 얼마나 걸리는지입니다. –

+0

하스켈은 1998 년에 "마지막으로 정의"되지 않았습니다. 하스켈은 항상 개발이 진행되어 왔으며 제작자가 하스켈 보고서 중 하나에 "하스켈 표준"태그를 추가하기로 결정했습니다. 출처 : "하스켈의 역사 : 수업과 함께 게으르다" –