الحل الأمثل البنية مع أكثر من 16 بايت
-
03-07-2019 - |
سؤال
أنا من النوع الذي أعتبره استخدامه بمثابة البنية.
- وهو يمثل قيمة واحدة
- هو غير قابل للتغيير
ولكن المشكلة هي أنه لديه 6 مجالات int.
لذلك الحل الذي أود أن استخدام هذا النوع ؟
- الاستمرار في استخدام البنية?
- تغيير إلى الصف ؟
- أو pack 6 الصحيحه في مجموعة من الباحث ، وهكذا كان حقل واحد فقط
تحرير
حجم البنية مع 6 صحيح المجالات 24 بايت ، وهي ضخمة لتمرير حولها.يوصي حجم البنية ليست أكثر من 16 بايت
المحلول
يعتمد ذلك على كيفية استخدامه؟
- هل ستقوم بتخصيص الكثير منها مقابل مرورها كثيرًا؟
- هل سيتم استهلاكها من قبل رمز الطرف الثالث؟ في هذه الحالة ، تمنحك الفصول الدراسية عادةً مزيدًا من المرونة.
- هل تريد بنية مقابل دلالات الفصل؟ على سبيل المثال ، غير قابلية؟
- هل ستستفيد من وجود اثنين من الحالات التي تم إنشاؤها مسبقًا من هذه الفئة يمكن إعادة استخدامها لتمثيل الحالات الخاصة؟ على غرار String.Empty. في هذه الحالة ، ستستفيد من الفصل.
من الصعب الإجابة فقط من المعلومات التي قدمتها في سؤالك.
نصائح أخرى
كن حذرا في الملاكمة. إذا كان من الممكن استهلاك بنيتك بطريقة تتوقع كائنًا ، فسيتم إجباره على كائن وسيكون لديك نجاح محتمل في الأداء.
ها هو المرجعي هذا يفسر ذلك بمزيد من التفصيل.
سأجعله فصلًا (#2) وبعد ذلك لن تقلق بشأنه.
من المحتمل أن يؤدي استخدام مجموعة من ستة أعداد صحيحة (#3) إلى جعل الكود الخاص بك أكثر صعوبة في القراءة. فئة مع معرفات وصفية لكل int سيكون أفضل بكثير.
دون رؤية بنيتك ، من الصعب قول أي شيء بشكل نهائي. لكني أظن أنه يجب عليك ترك هذا كهيكل.
ماذا عن WriteOnce<int[]>
?
أود أن أقترح كتابة معيار صغير لقياس أداء الخيارات المختلفة ، هذه هي الطريقة الوحيدة لمعرفة ذلك بالتأكيد. قد تفاجأ بالنتائج (غالبًا ما أكون).
(أفترض أن اهتمامك هنا هو الأداء.)
إذا كانت البيانات حامل ستكون ثابتة البنية-مقابل الدرجة السؤال من المرجح أن تعتمد على متوسط عدد من الإشارات التي من شأنها أن توجد كل حالة.إذا كان أحد لديه مجموعة من TwentyFourByteStruct[1000] ، أن مجموعة سوف تأخذ 24,000 بايت ، بغض النظر عما إذا كان كل عنصر يحمل قيمة مختلفة, كل عناصر يحملون نفس القيمة ، أو في مكان ما بينهما.إذا كان أحد لديه مجموعة من TwentyFourByteClass[1000] ، أن مجموعة سوف تأخذ 4000 أو من 8000 بايت (على أنظمة 32/64-بت) ، وكل متميزة مثيل TwentyFourByteClass الذي يتم إنشاؤه سوف يستغرق حوالي 48 بايت.إذا كان كل من مجموعة عناصر يحدث لعقد إشارة إلى نفس TwentyFourByteClass وجوه ، المجموع سوف يكون 4,048 أو 8,048 بايت.إذا كانت جميع عناصر مجموعة عقد مراجع مختلفة TwentyFourByteClass الكائنات ، المجموع سوف يكون 52,000 أو 56,000 بايت.
أما عن وقت التشغيل أداء أفضل أداء يمكن أن تحصل عموما سوف يتم تمرير الهياكل بالإشارة.يمر الهياكل حسب القيمة يتطلب نسخها ، والتي يمكن الحصول على مكلفة هياكل أكبر من 16 بايت (.صافي يتضمن تحسينات على الهياكل 16 بايت أو أصغر) ، ولكن تكلفة نوع القيمة بالرجوع هو نفسه سواء كان هو 1 بايت أو 16,000 بايت.
بشكل عام ، عند تخزين أكثر من قطعتين من البيانات ذات الصلة ، أحب أن أجعل فئة تربطهما معًا. خاصة إذا كنت سأمرهم كوحدة.