سؤال

أنا أكتب غير قابل للتغيير شجرة DOM في جاوة ، لتبسيط الوصول من خيوط متعددة.*

ومع ذلك, أنها لا تحتاج إلى دعم إدراج التحديثات بأسرع وقت ممكن.و بما أنه غير قابل للتغيير ، إن إجراء تغيير على عقدة على N يستحق المستوى من شجرة أنا بحاجة إلى تخصيص ما لا يقل ن العقد الجديد من أجل العودة إلى الشجرة الجديدة.

سؤالي هو هل سيكون أسرع بشكل كبير إلى ما قبل إحالة العقد بدلا من خلق مشاكل جديدة في كل مرة الشجرة تعديل?سيكون من السهل القيام به - الحفاظ على مجموعة من عدة مئات من غير مستخدمة العقد وسحب واحد من حمام السباحة بدلا من إنشاء واحد كلما كان المطلوب تعديل العملية.لا يمكن تجديد عقدة تجمع عندما يكون هناك شيء آخر يحدث.(في حال لم يكن واضحا ، وقت التنفيذ سيكون أكثر من ذلك بكثير في قسط في هذا التطبيق من كومة الفضاء)

هل من المجدي أن تفعل هذا ؟ أي نصائح أخرى على السرعة ؟

بدلا من ذلك, لا أحد يعرف إذا كان غير قابل للتغيير دوم المكتبة بالفعل ؟ انا بحثت ولكن لم أستطع العثور على أي شيء.

*ملاحظة:لأولئك منكم الذين ليسوا على دراية مفهوم ثبات ، فإنه يعني أنه على أي عملية على كائن التغييرات ذلك الأسلوب بإرجاع نسخة من الكائن مع التغييرات في المكان بدلا من تغيير وجوه.وهكذا ، إذا كان مؤشر ترابط آخر لا يزال القراءة الكائن وسوف تستمر بسعادة تعمل على "القديم" نسخة ، غير مدركين أن التغييرات التي تم إجراؤها ، بدلا من تحطمها فظيعة.انظر http://www.javapractices.com/topic/TopicAction.do?Id=29

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

المحلول

في هذه الأيام, إنشاء كائن جدا دانغ سريع و مفهوم الكائن تجميع هو نوع من عفا عليها الزمن (على الأقل في العام ، تجمع الاتصال بالطبع لا يزال ساري المفعول).

تجنب المبكرة الأمثل.إنشاء العقد الخاص بك عندما كنت في حاجة إليها عند نسخ, ومن ثم نرى إذا أن يصبح باهظة بطيئة.إذا كان الأمر كذلك, ثم ننظر إلى بعض التقنيات أن يصل إلى سرعة.ولكن إلا إذا كنت تعرف بالفعل هذا ما كنت قد حصلت ليست سريعة بما فيه الكفاية ، أنا لن أذهب إلى إدخال كل تعقيد وأنت تسير في حاجة إلى الحصول على تجميع الذهاب.

نصائح أخرى

أنا أكره أن أعطي الإجابة ، ولكن أعتقد أن الطريقة الوحيدة والفعالة للرد على أداء سؤال مثل هذا قد يكون لك رمز كلا النهجين ، المعيار اثنين ، ومقارنة النتائج.

أنا لست متأكدا مما إذا كان يمكنك تجنب صراحة مزامنة أساليب معينة من أجل التأكد من أن كل شيء هو مؤشر الترابط-الآمن.

حالة محددة تحتاج إلى مزامنة جانب واحد أو آخر من صنع حديثا عقدة المتاحة المواضيع الأخرى وإلا هل خطر VM/وحدة المعالجة المركزية إعادة ترتيب يكتب الحقول الماضي الكتابة من الإشارة إلى مشترك عقده ، وفضح طرف شيدت الكائن.

في محاولة للتفكير في مستوى أعلى.لديك ثابتة الشجرة (التي هي في الأساس مجموعة من العقد لافتا إلى الأطفال).تريد إدراج عقدة في ذلك.ثم ليس هناك طريقة للخروج:لديك لإنشاء جديد الشجرة كلها.

إذا اخترت تنفيذ الشجرة على أنها مجموعة من العقد لافتا إلى الأطفال ، ثم سيكون لديك لإنشاء العقد جديدة على طول الطريق من تغير عقدة الجذر.الآخرين لديهم نفس القيمة كما كان من قبل, عادة مشتركة.لذلك تحتاج إلى إنشاء جزئية جديدة الشجرة التي عادة ما يعني (عمق تحريرها عقدة) الأم العقد.

إذا كنت تستطيع التعامل مع أقل التنفيذ المباشر ، يجب أن تكون قادرة على الحصول على بعيدا مع إنشاء أجزاء من العقد ، وذلك باستخدام تقنيات مماثلة لتلك التي وصفها في وظيفية بحتة هياكل البيانات إما خفض متوسط تكلفة إنشاء أو يمكنك عن طريق تمرير ذلك باستخدام شبه نهج وظيفية (مثل إنشاء التكرار الذي يلتف القائمة مكرر ولكن إرجاع عقدة جديدة بدلا من القديمة ، جنبا إلى جنب مع آلية إصلاح هذه بقع بنية مع مرور الوقت).وهو XPath نمط api قد يكون أفضل من دوم api في هذه الحالة - أنه قد فصل العقد من الشجرة أكثر قليلا ، وعلاج تحور شجرة بذكاء أكثر.

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

أعتقد أن استخدام ثابتة العقد هو على الارجح لن تعطيك نوع من موضوع السلامة تحتاج في المقام الأول.ماذا يحدث إذا 1 موضوع بالتكرار على العقد (بحث أو ما شابه) ، في حين أن موضوع آخر هو إضافة/إزالة العقد?لن نتائج البحث تكون باطلة ؟ أنا لست متأكدا مما إذا كان يمكنك تجنب صراحة مزامنة أساليب معينة من أجل التأكد من أن كل شيء هو مؤشر الترابط-الآمن.

@تحريم مبرمج

عند سحب كائن من حمام سباحة, لن يكون لديك إلى الاحتجاج اضع لربط الأطفال ؟

كل عقدة لا تحتاج إلى أن تكون ثابتة داخليا إلى حزمة فقط التي تواجه الخارج واجهة. node.addChild() سيكون غير قابل للتغيير وظيفة مع الرؤية العامة والعودة وثيقة ، wheras node.addChildInternal() سوف تكون طبيعية قابلة للتغيير وظيفة مع حزمة الرؤية.ولكن لأنه الداخلية إلى الحزمة ، لا يمكن إلا أن يسمى سليل addChild() وهيكل ككل مقارعة أن يكون موضوع آمنة (المقدمة مزامنة الوصول إلى الكائن بركة).هل ترى عيبا في هذا... ؟ إذا كان الأمر كذلك ، من فضلك قل لي!

أعتقد أن استخدام ثابتة العقد هو على الارجح لن تعطيك نوع من موضوع السلامة تحتاج في المقام الأول.ماذا يحدث إذا 1 موضوع بالتكرار على العقد (بحث أو ما شابه) ، في حين أن موضوع آخر هو إضافة/إزالة العقد?

الشجرة ككل سوف تكون ثابتة.أقول لقد Thread1 و Thread2 ، شجرة dom1.Thread1 يبدأ عملية قراءة على dom1 ، في حين ، في وقت واحد ، Thread2 يبدأ عملية الكتابة على dom1.ومع ذلك ، فإن جميع التغييرات Thread2 يجعل وسوف يكون في الواقع إلى كائن جديد ، dom2 ، dom1 سوف يكون غير قابل للتغيير.صحيح أن القيم قراءة Thread1 سوف يكون (قليل ميكروثانية) خارج التاريخ ، ولكن ذلك لن حادث IndexOutOfBounds أو NullPointer استثناء أو شيء من مثل ذلك لو كان قراءة قابلة للتغيير الكائن الذي كان يجري كتابة.ثم Thread2 يمكن أن الحريق حدث تحتوي dom2 إلى Thread1 بحيث أن تقرأ مرة أخرى وتحديث النتائج ، إذا لزم الأمر.

تحرير:توضيح

أعتقد @المجرم لديه نقطة.هيكل شجرة DOM يقيم في العقد نفسه ، وجود عقدة لافتا إلى الأطفال.تعديل هيكل شجرة يجب عليك تعديل عقدة, لذلك لا يمكن أن يكون المجمعة, يمكنك إنشاء واحدة جديدة.

في محاولة للتفكير في مستوى أعلى.لديك ثابتة الشجرة (التي هي في الأساس مجموعة من العقد لافتا إلى الأطفال).تريد إدراج عقدة في ذلك.ثم ليس هناك طريقة للخروج:لديك لإنشاء جديد الشجرة كلها.

نعم ثابتة شجرة مؤشر الترابط-الآمن ، ولكنها سوف تؤثر على الأداء.إنشاء كائن قد تكون سريعة ، ولكن ليس بشكل أسرع ثم لا إنشاء الكائن.:)

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