F # 2.0이 VS2010의 일부가 되었기 때문에 F #에 관심이 있습니다. 나는 그것을 사용하는 것이 무엇인지 궁금해했다. 조금 읽었을 때 함수 호출을 측정하기위한 벤치 마크를 만들었습니다. 나는 ACKERMANN의 기능 :.Net 함수 호출 (C# F #) VS C++
C#을
sealed class Program
{
public static int ackermann(int m, int n)
{
if (m == 0)
return n + 1;
if (m > 0 && n == 0)
{
return ackermann(m - 1, 1);
}
if (m > 0 && n > 0)
{
return ackermann(m - 1, ackermann(m, n - 1));
}
return 0;
}
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("C# ackermann(3,10) = " + Program.ackermann(3, 10));
stopWatch.Stop();
Console.WriteLine("Time required for execution: " + stopWatch.ElapsedMilliseconds + "ms");
Console.ReadLine();
}
}
C++
class Program{
public:
static inline int ackermann(int m, int n)
{
if(m == 0)
return n + 1;
if (m > 0 && n == 0)
{
return ackermann(m - 1, 1);
}
if (m > 0 && n > 0)
{
return ackermann(m - 1, ackermann(m, n - 1));
}
return 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
clock_t start, end;
start = clock();
std::cout << "CPP: ackermann(3,10) = " << Program::ackermann(3, 10) << std::endl;
end = clock();
std::cout << "Time required for execution: " << (end-start) << " ms." << "\n\n";
int i;
std::cin >> i;
return 0;
}
F 번호
// Ackermann
let rec ackermann m n =
if m = 0 then n + 1
elif m > 0 && n = 0 then ackermann (m - 1) 1
elif m > 0 && n > 0 then ackermann (m - 1) (ackermann m (n - 1))
else 0
open System.Diagnostics;
let stopWatch = Stopwatch.StartNew()
let x = ackermann 3 10
stopWatch.Stop();
printfn "F# ackermann(3,10) = %d" x
printfn "Time required for execution: %f" stopWatch.Elapsed.TotalMilliseconds
자바
public class Main
{
public static int ackermann(int m, int n)
{
if (m==0)
return n + 1;
if (m>0 && n==0)
{
return ackermann(m - 1,1);
}
if (m>0 && n>0)
{
return ackermann(m - 1,ackermann(m,n - 1));
}
return 0;
}
public static void main(String[] args)
{
System.out.println(Main.ackermann(3,10));
}
}
,691을 사용했다 363,210
다음
C#을 = 510ms
C++ = 130ms 동안
F 번호 = 185ms
자바 = 유래 :
우리가 사용하고자하는 경우는 (코드의 작은 금액 제외) F 번호의 힘 닷넷과 약간 빠른 실행을 얻으시겠습니까? 이러한 코드 (특히 F #)를 최적화 할 수 있습니까?
업데이트. Console.WriteLine을 제거하고 디버거없이 C# 코드를 실행합니다. C# = 400ms
벤치 마크를 실행하기 전에 한 번 방법을 실행하십시오. 시간에는 중간 언어를 JIT하는 데 소요 된 시간이 포함됩니다. 또한, Console.WriteLine()과 같은 메소드를 벤치 마크 밖에서 사용하십시오. 왜냐하면 심각하게 느리기 때문입니다. –
"벤치 마크를 실행하기 전에 한 번 방법을 실행하십시오. 중간 언어를 JIT하는 데 걸리는 시간이 시간에 포함되어 있습니다." ? 나는 dd = ackermann 3 10을 더하고 7ms를 여분으로 준다. C#에 대한 변경 사항이 없습니다. "Console.WriteLine()과 같은 메소드를 벤치 마크 밖에서 사용하면 속도가 느려질 수 있습니다." 좋은 생각이지만 속도가 향상되지 않았습니다. –
예, F # 및 C# 모두 JIT 컴파일 됨 - 메소드를 두 번 실행하고 두 번째 벤치 마크를 사용하십시오. 그 이유는 JIT 컴파일러가 프로세서의 특정 기능 (CISC 컴퓨팅 우수성)에 맞게 컴퓨터 코드를 최적화하기 때문입니다. – Aaronontheweb