c# - मोनो परियोजना: मोनो.NET की तुलना में अधिक तेज़ क्यों है?




mono (3)

मुझे आश्चर्य है कि मोनो .NET की तुलना में तेज़ है। क्या किसी को पता है कि ऐसा क्यों है? मैं .NET से धीमी होने की उम्मीद कर रहा था, लेकिन मेरे प्रयोगों से मामला कम नहीं था।

मेरे पास .NET फ्रेमवर्क वाला एक विंडोज़ xp लैपटॉप है। मैं Windows XP के शीर्ष पर vmware vmplayer पर CentOS चला रहा हूं। मैं मोनो ट्राई करना चाहता था। इसलिए मोनो 2.6.1 स्रोतों को पकड़ा और vmplayer में CentOS पर स्थापित किया। मेरे पास .net 2.0 का उपयोग करके एक परीक्षण webservice एप्लिकेशन को राइट किया गया है। इसे wndows पर निष्पादित किया गया है, यह काम किया है, मैंने vmplayer में बिना किसी पुनर्संयोजन के बाइनरी को ट्रांसफर किया और इसे सेंटो पर निष्पादित किया। हुर्रे यह काम किया! जीवन अच्छा है लेकिन फिर कुछ और ने मेरा ध्यान आकर्षित किया। सेंटो पर आवेदन का निष्पादन तेजी से हो रहा था। मुझे अपनी आँखों पर विश्वास नहीं हुआ।

मेरे अवलोकन की पुष्टि करने के लिए, मैंने नेटवर्क को समीकरण से बाहर कर दिया क्योंकि नेटवर्क रिपीट बहुत सारे बाहरी कारकों पर निर्भर करता है।

मैंने इंटरनेट से छोटे डमी लूप कोड को पकड़ा, इसे विजुअल स्टूडियो में खिड़कियों के साथ-साथ CentOS में भी संकलित किया, परिणाम इस प्रकार हैं

Output on windows console is HelloConsole\bin\Debug>HelloConsole.exe
Result =2.66666664666712E+24
37443.6077769661 ms


Output on Centos console is [[email protected] Math.Pow]$ mono HelloConsole.exe
Result =2.66666664666712E+24
28790.6286 ms

अगर कोई भी इस व्यवहार को समझा सकता है, तो यह बहुत अच्छा होगा। मेरे आम आदमी की समझ मोनो के कार्यान्वयन .NET फ्रेमवर्क की तुलना में अधिक कुशल है। यहां तक ​​कि अगर मुझे लगता है कि मोनो का मठ कार्यान्वयन केवल कुशल है। लेकिन वित्तीय डेटा के प्रसंस्करण, ग्राफिक्स गणना जैसे बहुत सारे कार्यान्वयन मठ पुस्तकालय पर बहुत निर्भर करते हैं। सीधे वीएमवेयर के बिना मोनो / सेंटोस पर परीक्षण करना अधिक दिलचस्प होगा लेकिन इसके लिए कुछ समय चाहिए। मैं इसे अगले सप्ताह के अंत में एक कोशिश दे सकता हूं।

public static void DummyLoop()
    {
        double sumOfPowers = 0;
        int count = Convert.ToInt32(ConfigurationManager.AppSettings["count"]);

            for (int i = 0; i < count; i++)
            {
                sumOfPowers += Math.Pow(i, 2);   
            }


        Console.WriteLine("Result =" + sumOfPowers);   
    }


    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        DummyLoop();
        stopWatch.Stop();
        double ms = (stopWatch.ElapsedTicks * 1000.0) / Stopwatch.Frequency;
        Console.WriteLine(string.Concat(ms.ToString(), " ms"));
        Console.ReadLine();
    }

आप वास्तव में यहाँ तुलना नहीं कर रहे हैं। आप मूल रूप से दोनों के बीच एक फ़ंक्शन (Math.Pow) की तुलना कर रहे हैं। संभवत: एक वास्तविक एप्लिकेशन इस एक फ़ंक्शन की तुलना में अधिक चीजें करेगा।

मोनो के Math.Pow सी में इसे लागू करने के द्वारा अनुकूलित किया जा रहा है। मुझे नहीं पता कि कैसे .net इसे लागू करता है। इसे पूरी तरह से प्रबंधित कोड में लागू किया जा सकता है।

संभवतः आप पाएंगे कि दोनों रनटाइम हर दिन की जरूरतों के लिए काफी तेज हैं।


खैर, मुझे आश्चर्य नहीं है कि यह उसी बायोटेक को तेजी से निष्पादित करता है।

यदि आप मोनो के विंडोज संस्करण की कोशिश करते हैं, तो मैं उन मामलों को छोड़कर एक छोटे प्रदर्शन अंतर की उम्मीद करूंगा, जिनमें सिमड अनुकूलित ऑपरेशन शामिल हैं।


यह सब वास्तव में परीक्षण टाइमर का कार्यान्वयन है - जो आमतौर पर खराब परीक्षण होते हैं क्योंकि कोई भी दो ओएस उन्हें लागू नहीं करते हैं। कुछ हार्ड टाइमर का उपयोग करते हैं जो बहुत सटीक है (लिनक्स) और कुछ में सिस्टम की जरूरतों के आधार पर प्रीमेप्टेड (विंडोज) की तुलना में टाइमर है। यदि आप एक कॉल को बेंचमार्क करना चाहते हैं तो आप मध्यवर्ती कॉल से बचें या आप शायद उन्हें समय दे रहे हैं जो आप सोच रहे हैं कि आप परीक्षण कर रहे हैं। गणित POW दोनों प्लेटफार्मों पर लगभग एक ही होने जा रहा है क्योंकि गणित की गणना करने के लिए कि यह सौ वर्षों में नहीं बदला है। मैं कुछ भी से अधिक टाइमर के साथ ओएस अंतर की ओर सीखता हूं।





mono