몇 가지 실험을 해본 결과 여기에 제가 발견 한 것이 있습니다.하스켈 - for 루프와 동등한 성능을 제공합니까?
int main()
{
for(int i = 0;
i < 1000000;
++i)
{}
}
다음 하스켈 프로그램 : 다음 C 프로그램 고려 여기
import System.IO
loop :: Int -> IO()
loop n = if 0 == n then return() else loop (n-1)
main = loop 1000000
은 상기 C 프로그램 time
의 출력이다
real 0m0.003s
user 0m0.000s
sys 0m0.000s
... 및 대 Haskell 프로그램 :
real 0m0.028s
user 0m0.027s
sys 0m0.000s
처음에는 gcc가 빈 루프를 감지하고이를 최적화했지만 반복 횟수를 늘린 후 프로그램 실행 시간이 증가했다고 생각했습니다.
C 버전
real 0m0.024s
user 0m0.023s
sys 0m0.000s
하스켈 버전
real 0m0.245s
user 0m0.247s
sys 0m0.000s
당신이 볼 수 있듯이, 하스켈 다음은 프로그램의 모두 time
의 출력은 10000000로 설정 반복의 수입니다 프로그램은 10 배 느립니다.
질문 : Haskell의 for
루프에 대한 효율적인 대안은 무엇입니까? 방금 본 것처럼 간단한 재귀는 프로그램을 약 10 배 정도 느려지 게합니다 (그리고 이것은 꼬리 재귀 최적화를 수행 한 것일 수 있습니다).
를 확인, 완전히 최적화 된 C 프로그램에서 생성 된 어셈블리 코드는 루프를 제거 하는가? – shuttle87
Pfft, 'while'루프. 이봐. : P –
@ shuttle87 -O3 플래그를 사용하면 루프가 완전히 제거되고 루프는 제거되지 않습니다. –