चूंकि एफ # 2.0 वीएस -2010 का हिस्सा बन गया है, इसलिए मैं एफ # में रूचि लेता हूं। मुझे आश्चर्य हुआ कि इसका उपयोग करने का क्या मतलब है। मैं थोड़ा सा पढ़ूंगा और मैंने फ़ंक्शन कॉलिंग को मापने के लिए एक बेंचमार्क बनाया था। मैं एकरमैन के समारोह :)नेट फ़ंक्शन कॉलिंग का प्रदर्शन (सी # एफ #) वीएस सी ++
सी #
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();
}
}
सी ++
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;
}
एफ #
// 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));
}
}
का इस्तेमाल किया है 363,210
एक तो
सी # = 510ms
C++ = 130ms
एफ # = 185ms
जावा = Stackoverflow :)
यह एफ # की शक्ति (कोड की एक छोटी राशि को छोड़कर) है हम उपयोग करना चाहते हैं नेट और थोड़ा तेज़ निष्पादन प्राप्त करें? क्या मैं इनमें से किसी भी कोड को अनुकूलित कर सकता हूं (विशेष रूप से एफ #)?
अद्यतन। मैंने कंसोल से छुटकारा पा लिया। राइटलाइन और डीबगर के बिना सी # कोड चलाएं: सी # = 400 एमएमएस
बेंचमार्क चलाने से पहले एक बार अपने विधि निष्पादित। आपके समय में जेआईटी को मध्यवर्ती भाषा में लिया गया समय शामिल है। साथ ही, अपने बेंचमार्क के बाहर Console.WriteLine() जैसी विधियां लें, क्योंकि वे गंभीर रूप से धीमे हैं। –
"अपने विधि एक बार बेंचमार्क चलाने से पहले निष्पादित। आपका बार समय मध्यवर्ती भाषा जीत के लिए ले जाया शामिल किया है।" यह है? मैं dd = ackermann 3 10 जोड़ने देता हूं और मुझे 7 एम अतिरिक्त देता है। सी # फ्लॉप परिवर्तन :) के लिए "इसके अलावा,, Console.WriteLine() अपने बेंचमार्क के बाहर की तरह तरीकों क्योंकि वे गंभीरता से धीमी गति से कर रहे हैं।" अच्छा विचार लेकिन –
तेज नहीं हुआ हाँ, एफ # और सी # दोनों जेआईटी संकलित हैं - विधि को दो बार चलाएं और दूसरे बेंचमार्क का उपयोग करें। इसका कारण यह है कि जेआईटी कंपाइलर आपके प्रोसेसर की विशिष्ट क्षमताओं (सीआईएससी कंप्यूटिंग भलाई) के लिए मशीन कोड को अनुकूलित करता है – Aaronontheweb