खोज…


टिप्पणियों

StackExchange.Redis की प्रोफाइलिंग विशेषताएँ IProfiler इंटरफ़ेस, और ConnectionMultiplexer.RegisterProfiler(IProfiler) , ConnectionMultiplexer.BeginProfiling(object) , ConnectionMultiplexer.FinishProfiling(object) विधियों से बनी हैं।

स्टार्ट एंड फिनिश प्रोफाइलिंग एक संदर्भ object लेता है ताकि संबंधित कमांड को एक साथ समूहीकृत किया जा सके।

यह समूहीकरण कमांड के प्रारंभ में संदर्भ ऑब्जेक्ट के लिए आपके IProfiler इंटरफ़ेस को क्वेरी करके काम करता है, इससे पहले कि कोई भी थ्रेडिंग शनीगन्स हुआ है, और उस कमांड को किसी अन्य कमांड के साथ जोड़ रहा है जिसमें समान संदर्भ ऑब्जेक्ट है। आरंभ को उसी संदर्भ ऑब्जेक्ट के साथ कहा जाना चाहिए ताकि StackExchange.Redis को उस संदर्भ ऑब्जेक्ट के साथ प्रोफाइलिंग कमांड शुरू करना पता हो, और फिनिश को प्रोफाइलिंग को रोकने और परिणामों को वापस करने के लिए कहा जाता है।

सभी थ्रेड्स के समूह से एक साथ समूह बनाएं

class ToyProfiler : IProfiler
{
    public ConcurrentDictionary<Thread, object> Contexts = new ConcurrentDictionary<Thread, object>();

    public object GetContext()
    {
        object ctx;
        if(!Contexts.TryGetValue(Thread.CurrentThread, out ctx)) ctx = null;

        return ctx;
    }
}


// ...

ConnectionMultiplexer conn = /* initialization */;
var profiler = new ToyProfiler();
var thisGroupContext = new object();

conn.RegisterProfiler(profiler);

var threads = new List<Thread>();

for (var i = 0; i < 16; i++)
{
    var db = conn.GetDatabase(i);

    var thread =
        new Thread(
            delegate()
            {
                var threadTasks = new List<Task>();

                for (var j = 0; j < 1000; j++)
                {
                    var task = db.StringSetAsync("" + j, "" + j);
                    threadTasks.Add(task);
                }

                Task.WaitAll(threadTasks.ToArray());
            }
        );

    profiler.Contexts[thread] = thisGroupContext;

    threads.Add(thread);
}

conn.BeginProfiling(thisGroupContext);

threads.ForEach(thread => thread.Start());
threads.ForEach(thread => thread.Join());

IEnumerable<IProfiledCommand> timings = conn.FinishProfiling(thisGroupContext);

अंत में, टाइमिंग में 16,000 IProfiledCommand ऑब्जेक्ट शामिल होंगे - जो रेडिस को जारी किए गए प्रत्येक कमांड के लिए।

थ्रेड जारी करने के आधार पर समूह कमांड

ConnectionMultiplexer conn = /* initialization */;
var profiler = new ToyProfiler();

conn.RegisterProfiler(profiler);

var threads = new List<Thread>();

var perThreadTimings = new ConcurrentDictionary<Thread, List<IProfiledCommand>>();

for (var i = 0; i < 16; i++)
{
    var db = conn.GetDatabase(i);

    var thread =
        new Thread(
            delegate()
            {
                var threadTasks = new List<Task>();

                conn.BeginProfiling(Thread.CurrentThread);

                for (var j = 0; j < 1000; j++)
                {
                    var task = db.StringSetAsync("" + j, "" + j);
                    threadTasks.Add(task);
                }

                Task.WaitAll(threadTasks.ToArray());

                perThreadTimings[Thread.CurrentThread] = conn.FinishProfiling(Thread.CurrentThread).ToList();
            }
        );

    profiler.Contexts[thread] = thread;

    threads.Add(thread);
}

threads.ForEach(thread => thread.Start());
threads.ForEach(thread => thread.Join());

perThreadTimings , थ्रेड द्वारा जारी किए गए 1,000 IProfilingCommands की 16 प्रविष्टियों के साथ समाप्त होता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow