سؤال

ولدي تنفيذ IDictionary<TKey,TValue> الذي يحمل داخليا ن Dictionary<TKey, TValue> البعض وتوزع أن الإدراج من قبل شفرة التجزئة من مفتاح القواميس الفرعية invidual. مع 16 قواميس الفرعية، وعدد من الاصطدامات منخفض جدا على جهاز 4-الأساسية.

لالإدراج موازية، أنا مؤمن الإضافية الأسلوب مع ReaderWriterLockSlim، وتأمين فقط الفرد القاموس الفرعي:

  public void Add(TKey key, TValue value)
        {
            int poolIndex = GetPoolIndex(key);
            this.locks[poolIndex].EnterWriteLock();
            try
            {
                this.pools[poolIndex].Add(key, value);
            }
            finally
            {
                this.locks[poolIndex].ExitWriteLock();
            }
        }

عند إدخال العناصر مع أربعة المواضيع، أنا فقط حصلت على حوالي 32٪ استخدام وحدة المعالجة المركزية وسوء الأداء. لذلك أنا استبدال ReaderWriterLockSlim من قبل مراقب (أي الكلمة lock). كان استخدام وحدة المعالجة المركزية الآن في ما يقرب من 100٪ وكان أداء أكثر من الضعف.

وسؤالي هو: لماذا زيادة استخدام وحدة المعالجة المركزية؟ لا ينبغي أن يكون تغيير عدد من الاصطدامات. ما الذي يجعل ReaderWriterLock.EnterWriteLock الانتظار مرات عديدة؟

هل كانت مفيدة؟

المحلول

لكتابة فقط تحميل مراقب أرخص من ReaderWriterLockSlim، ومع ذلك، إذا كنت محاكاة قراءة + كتابة الحمل حيث القراءة هي أكبر بكثير من الكتابة، ثم ReaderWriterLockSlim يجب من أداء مراقب.

نصائح أخرى

وأنا لا المعلم، ولكن تخميني هو أن RWLS هو أكثر الموجهة نحو المنافسة الثقيلة (مثل، مئات المواضيع) بينما هو Monitor أكثر انسجاما نحو تلك القضايا تزامن لمرة واحدة.

وأنا شخصيا استخدام فئة TimerLock يستخدم Monitor.TryEnter مع معلمة المهلة.

وكيف يمكنك أن تعرف ما تسبب في سوء الأداء؟ لا يمكنك الذهاب التخمين ذلك، فإن الطريقة الوحيدة هي أن تفعل بعض نوع من التنميط.

وكيف تتعاملون مع قفل لجمع الوالدين أو هو ثابت؟

وربما تحتاج إلى إضافة بعض إخراج التصحيح ونرى ما يحدث حقا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top