स्ट्रिंग कड़ी के लिए अनुकूलन सकल

वोट
18

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

मैं इस कार्यक्रम अल्पविराम के द्वारा से 0 19999 करने के लिए अलग पूर्णांकों की एक लंबी स्ट्रिंग निर्माण करने के लिए लिखा था।

using System;
using System.Linq;
using System.Diagnostics;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            const int size = 20000;

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ,  + b);
            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds + ms);
        }
    }
}

जब मैंने इसे चलाने के लिए, यह कहते हैं:

5116ms

पाँच सेकंड में, भयानक। बेशक यह क्योंकि पूरी स्ट्रिंग पाश के आसपास हर बार की नकल की जा रही है है।

लेकिन क्या एक बहुत छोटी टिप्पणी ने संकेत दिया परिवर्तन करना तो क्या होगा?

using System;
using System.Linq;
using System.Diagnostics;

namespace ConsoleApplication5
{
    using MakeAggregateGoFaster;  // <---- inserted this

    class Program
    {
        static void Main(string[] args)
        {
            const int size = 20000;

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + ,  + b);
            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds + ms);
        }
    }
}

अब जब मैं इसे चलाने के लिए, यह कहते हैं:

42ms

100x से अधिक तेजी से।

सवाल

MakeAggregateGoFaster नाम स्थान में क्या है?

अद्यतन 2: यहाँ मेरा उत्तर लिखा

10/12/2008 को 00:12
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
40

क्यों सकल के अन्य रूपों में से एक का उपयोग नहीं?

Enumerable.Range(0, size ).Aggregate(new StringBuilder(),
        (a, b) => a.Append(", " + b.ToString()),
        (a) => a.Remove(0,2).ToString());

आप अपने बीज के लिए किसी भी प्रकार निर्दिष्ट प्रदर्शन जो कुछ स्वरूपण या कस्टम कॉल पहला लैम्ब्डा समारोह में की जरूरत है और फिर दूसरी लैम्ब्डा समारोह में उत्पादन प्रकार अनुकूलित कर सकते हैं। सुविधाओं में बनाया पहले से ही लचीलापन आप की जरूरत प्रदान करते हैं। मेरे रन 6ms को 1444ms से चला गया।

14/01/2009 को 18:18
का स्रोत उपयोगकर्ता

वोट
15

आप नाम स्थान MakeAggregateGoFaster में अपने खुद के विस्तार विधि के साथ System.Linq.Aggregate 'अधिभावी' कर रहे हैं।

शायद पर विशेष IEnumerable<string>और एक StringBuilder का इस्तेमाल कर रही?

हो सकता है कि लेने के एक Expression<Func<string, string, string>>एक के बजाय Func<string, string, string>तो यह अभिव्यक्ति पेड़ का विश्लेषण और कुछ कोड समारोह सीधे कॉल करने के बजाय StringBuilder का उपयोग करता है संकलन कर सकते हैं?

सिर्फ अनुमान।

10/12/2008 को 00:30
का स्रोत उपयोगकर्ता

वोट
5

सवाल का जवाब नहीं है, लेकिन मुझे लगता है कि यहां मानक पैटर्न StringBuilder या string.Join उपयोग करने के लिए कर रहे हैं:

string.join(", ",Enumerable.Range(0, size).Select(n => n.ToString()).ToArray())
10/12/2008 को 00:16
का स्रोत उपयोगकर्ता

वोट
4

क्योंकि एक पहेली के रूप में लंबे समय के रूप में यह कहा समस्या के पत्र को संतुष्ट करता है डिग्री बदलती में मजबूती बलिदान करने के लिए अनुमति दी है कारण मैं ने पूछा कि क्या यह एक पहेली था। इसे ध्यान में रखते, यहाँ जाता है:

समाधान 1 (तुरन्त चलाता है, समस्या को मान्य नहीं करता):

public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
     return "";
}

समाधान 2 (के बारे में के रूप में तेजी से समस्या की आवश्यकता के रूप में चलाता है, लेकिन पूरी तरह से प्रतिनिधि पर ध्यान नहीं देता):

public static string Aggregate(this IEnumerable<string> l, Func<string, string, string> f) {
    StringBuilder sb = new StringBuilder();
    foreach (string item in l)
        sb.Append(", ").Append(item);
    return sb.Remove(0,2).ToString();
}
10/12/2008 को 00:35
का स्रोत उपयोगकर्ता

वोट
3

ठीक है, कि पूरी तरह से क्या कोड MageAggregateGoFaster नाम स्थान में है पर अब निर्भर ऐसा नहीं है चाहते हैं?

यह नाम स्थान .NET रनटाइम का हिस्सा नहीं है, तो आप कुछ कस्टम कोड में लिंक करने के बाद।

व्यक्तिगत रूप से मुझे लगता है कि होता है कि कुछ है कि स्ट्रिंग संयोजन या इसी तरह पहचानता है, और एक सूची, या इसी तरह बनाता है, तो एक बड़ा StringBuilder आवंटित और संलग्न उपयोग करता है।

एक गंदा समाधान होगा:

namespace MakeAggregateGoFaster
{
    public static class Extensions
    {
        public static String Aggregate(this IEnumerable<String> source, Func<String, String, String> fn)
        {
            StringBuilder sb = new StringBuilder();
            foreach (String s in source)
            {
                if (sb.Length > 0)
                    sb.Append(", ");
                sb.Append(s);
            }

            return sb.ToString();
        }
    }
}

गंदा है क्योंकि इस कोड है, जबकि कर आप क्या कहते हैं आप अपने कार्यक्रम के साथ अनुभव करते हैं, समारोह प्रतिनिधि बिल्कुल का उपयोग नहीं करता। यह, हालांकि, नीचे चारों ओर 2800ms से निष्पादन समय 11ms करने के लिए अपने कंप्यूटर पर लाना होगा, और अभी भी एक ही परिणाम का उत्पादन।

अब, अगली बार, शायद आप एक असली सवाल के बजाय पूछना चाहिए बस देखो कैसे चतुर मैं कर रहा हूँ छाती-पिटाई के प्रकार?

10/12/2008 को 00:15
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more