다음 스칼라 코드는 1.5 분 안에 완료되지만 GO 코드는 2.5 분 안에 완료됩니다.
최대 fib (40)까지 모두 2 초가 소요됩니다. 그 차이가 fib (50)에 나타난다
나는 네이티브가되어 가고 있다는 인상을 받았고, 스칼라가 빠르다.재귀 GO 대 스칼라
스칼라
def fib(n:Int):Long = {
n match {
case 0 => 0
case 1 => 1
case _ => fib(n-1) + fib(n-2)
}
}
는
func fib(n int) (ret int) {
if n > 1 {
return fib(n-1) + fib(n-2)
}
return n
}
스칼라 최적화를 GO?
골란 한계?
"내 다른 자동차는 캐드 러입니다."라는 질문은 "스칼라가 어떻게이 특정 마이크로 벤치 마크에서보다 빠르다"는 질문에 "
피보나치를 잊어 버리면 재귀가 필요한 기능이 있다고 말할 수 있습니다.
재귀 상황에서 스칼라가 우월합니까?
아마 내부 컴파일러 구현 또는 심지어 스칼라 특정 최적화.
아는 경우 답변하십시오.
이동 루프 실행에 15,000,000,000는 재귀 꼬리 아닙니다 때문에 스칼라 솔루션 스택을 소모합니다
func fib(n int) (two int) {
one := 0
two = 1
for i := 1; i != n; i++ {
one, two = two, (one + two)
}
return
}
최적화가 표시되지 않습니다. 지수가 있습니다. 재귀 함수를 작성하는 데 ** 사용하지 않는 방법을 보여주기 위해 사용 된 동일한 재귀 피보나치 예제입니다. 일부 구현 뉘앙스, 아마도 가비지 수집, 아마도 프로세스에 사용할 수있는 메모리 (예 : 스칼라에서 어떤 이유로 작업 및 이동에 충분)로 인해 효과가 나타납니다. 나는 메모리 소비량이 최고조에 있는지 확인했다. – dmitry
스칼라는 JIT 컴파일이므로 몇 번의 재귀 호출 후에도 임시 메모를 할 수 있습니다. 루프 풀기와 관련하여 JVM이 아주 좋은 최적화를 수행하도록했습니다. – LinearZoetrope
go 코드는 기계 코드로 컴파일되지만 런타임은 여전히 모든 메모리 및 스택 관리를 수행하므로 기본적으로 JVM과 동일합니다. 나는 놀랍지도 않다. JVM은 최적화 된 것보다 더 최적화되어있다. – chendesheng