الكائنات والذاكرة - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183) +--- الموضوع : الكائنات والذاكرة (/showthread.php?tid=16535) الصفحات:
1
2
|
الكائنات والذاكرة - LoveVb - 22-07-16 السلام عليكم ورحمة الله وبركاتة جائتني فكرة لكنها تتطلب إنشاء 100 كائن تقريبآ على الفورم هل هذا بسيط على الذاكرة لانها مسببه لي عقده مع العلم حتى اني لا استطيع استخدام Dispose لانها مرئيه على الفورم هل عند الخروج من البرنامج استخدم Dispose ؟ السؤال الثاني : ماذا لو استخدم الكائنات مباشره بدون مغير ماذا سيحدث بالذاكرة وهل هو افضل. مثال me.controls.add(new control) هل سيخزن الكائن في الذاكرة اتمنى اعطائي معلومات عن هذه لانها مهمه بالنسبه لي لدي معلومه واحده عنها وهي ان garbage collector سريع في عملية تنظيفها هل هذا صحيح واضن ان السؤال مخصص في لغة الجافا لذلك لست متاكد السؤال الثالث : لدي مصفوفة عامه من نوع String وعدد عناصرها 20 واقوم بتغيير عناصرها باستمرار السؤال هنا هل استخدم String او StringBuilder السؤال الرابع : عن StringBuilder تُـستخدم لبناء نصوص في حلقة تكرارية بدلآ من String لانها تنشئ مكان جديد بالذاكرة واذا كان هناك نص ولن يتغير استخدم String وماذا لو كان هنا نص صغير واقوم بتغييره لكن ليس كثيرآ ماذا ساستخدم سؤال الخامس : لو كان هناك متغير عام من نوع String وقمت بتغييره سيتم انشاء كائن جديد لكن هل الكائن القديم لن ينضفه الgarbage collector الا بعد انهاء البرنامج لانها عام ام؟ السؤال الاخير : هل يُفضل استخدام دالة في حلقة تكرارية ولديها بارمتر من نوع String او ماهو البديل لها - هذه الاسئلة حيرتني واذا عرفتها سارتاااااااااااح ^^ والله يوفقكم RE: الكائنات والذاكرة - الوادي - 22-07-16 هذا يعتمد على نوع الكائن مثلا 100 DataGridView غير TextBox لكن أعتقد مئة ليس بالمخيف لكن ما هي الفكرة، لأنه ممكن تكون هناك أفكار أفضل. ما سر اهتمامك بالذاكرة RE: الكائنات والذاكرة - LoveVb - 22-07-16 فكرة البرنامج هي عارض خلفيات يوجد بديل لها وهو عرضها في ListView مع ImageList لكن اريد عرضها بشكل جميل ك أنشاء UserControl وتصميمه ما سر اهتمامك بالذاكرة لا اعرف لكن اعتقد عند معرفتي ل Stack & Heap اهتميت به ايضا String عند تغييرها قيمتها صراحة انا معقد اهتم بمعرفة تفاصيل البيانات وكيف تعمل حتى اني لم ادرس اساسيات اللغة كامله استعمل خيالي لاتخيل البرنامج وكيف يعمل ومستحيل استخدم كود بدون ماافهمه لاني لا استطيع تخيله RE: الكائنات والذاكرة - الوادي - 22-07-16 جمعت لك مجموعة دروست أرجو أن تجد الفائدة (خصوصاً الفيديو الأول) dotNET Stack and Heap https://www.youtube.com/watch?v=clOUdVDDzIM Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing http://www.codeproject.com/Articles/76153/Six-important-NET-concepts-Stack-heap-value-types Differences between Stack and Heap http://net-informations.com/faq/net/stack-heap.htm وهذا الدرس بخصوص Value types و Reference types Advanced C#: Lesson 3 - Value types vs Reference types https://www.youtube.com/watch?v=mvieNUe9Urs RE: الكائنات والذاكرة - LoveVb - 22-07-16 تسسلم والله ياغالي المقطع الثاني للان محفوظ عندي واستفدت منه كثير وساحاول قراءت المواضيع مع ان الانجليزي ليس جيدا الله يعطيك العافيه واي آحد عنده اي معلومه اتمنى يطرحها وجزاكم الله خير RE: الكائنات والذاكرة - الشاكي لله - 22-07-16 السؤال الاول : 100 كائن على الفورم ابدا ليس بالشيئ الكثير واذا كنت تريد حساب الاستهلاك بدقة تستطيع استعمال احدى تقنيات الprofiling لفحص الاداء واستهلاك الذاكرة. -- السؤال الثاني : طبعا هناك فرق بين تعريف متغير من Instance ، وبين تمرير الـInstance مباشرة الى الدالة بدون تعريف متغير :- PHP كود : private void Form1_Load(object sender, EventArgs e) بينما عند تمرير Instance مباشرة بدون تعريف متغير هنا يكون الوضع افضل قليلا بالنسبة للذاكرة : PHP كود : private void Form1_Load(object sender, EventArgs e) والسبب في ذلك ان الـ Garbage Collector تقوم بحذف الكائن من الذاكرة عندما لايوجد مؤشر للكائن. في الاقتباس الاول قمنا بتعريف متغير(مؤشر) باسم sw يشير الى كائن جديد من FileInfo وهذا المتغير sw سيعيش معنا طوال فترة تنفيذ الدالة Form_Load حيث كما تعلم انه متغير محلي على مستوى دالة وسيموت بمجرد انتهاء الدالة من تنفيذ جميع اكوادها . في الاقتباس الثاني قمنا بتمرير الكائن مباشرة بواسطة new الى الدالة . ونتيجة لذلك ، تم اسناد الكائن الى الparameter الخاص بالدالة LoadFile مباشرة ، والParameter بطبيعة الحال سيموت مع انتهاء الدالة LoadFile من جميع اكوادها وبطبيعة الحال نعرف دالة LoadFile ستنهي اكوادها قبل الدالة Form_Load ، لذلك الاقتباس الثاني هو الاصح بسبب ان مؤشر الكائن سيموت اسرع وعندما يموت مؤشر الكائن ، سيعتبر ذلك علامة للـ Garbage collector بان يقوم بحذف الكائن من الMemory، ولكن تذكر ان كل هذا الكلام كله عمليا ليس صحيحا تماما ، والسبب انننا لانعرف متى ستقوم ال Garbage Collector بمسح الكائنات من الذاكرة ، ربما سيقوم بمسحها بعد 3 دقائق لذلك لن يفرق لو استخدمت الاقتباس الاول او الاقتباس الثاني (الا اذا اردت توفير 32 بت من الذاكرة حيث ان المتغير الذي يشير الى الكائن هو عبارة عن Native Pointer وحجمه على حسب معمارية الCPU اي انه في معالجات ال32 بت سيكون حجم المتغير sw بالضبط 32 بت (4 بايت) بينما في معالجات ال64 بت سيكون خجمه 64 بت (8 بايت) فاذا اردت توفير هذه البايتات بالتاكيد سيكون الاقتباس الثاني افضل لك (ولكن توفير هذه البايتات البسيطة ليس بالامر العظيم ههههه) -- السؤال الثالث : بالطبع استخدم string ،لاحاجة ابدا للstringBuilder -- السؤال الرابع : كلامك صحيح نستخدم الـ StringBuilder عندما نريد اسناد النصوص بواسطة & او + (في سي شارب) والسبب في ذلك انت تعرفه ، وهو ان string تقوم باضافة بيانات جديدة الى الذاكرة بدل القيام بتعديلها وهذا يسبب استهلاك كبير للذاكرة .. اما موضوع كان التغيير كبيرا او كان صغيرا هذا حسب تقديرك لهذا الامر ، وتذكر ليست جميع الاجهزة متساوية في الامكانيات ، تطبيقك قد يقوم شخص ما بتشغيله على جهاز يحتوي على ram 8 GB ـ هل تضن ان هذا الموضوع ممكن يسبب مشكلة هههه مستحيل . وتذكر دائما ان الـ Garbage Collector تقوم بحذف الكائن من الذاكرة (سواء كان class او نص او رقم) كله يتم مسحه من الذاكرة عندما لا يؤشر عليه أحد ، فمثلا الكود التالي لن يسبب اي مشكلة لنا :- PHP كود : private void Form1_Load(object sender, EventArgs e) فكما ترى ، الgarbge تعمل بنفس الطريقة سواء كان المتغير يشير الى class او الى نص او الى رقم . لايهم ، الGarbge ستخسف به مادام الكائن ضمن دائرة الـ Managed Code -- السؤال الخامس : لا ليس بالضرورة عند اغلاق التطبيق ، التطبيق ليس له دخل ابدا بعمل الgarbge collector ، فالgarbge سيقوم بحذف المتغير العام عند موت الclass الحاضن له ، فلو كان المتغير معرفا في class مثلا form2 ، فاذن المتغير سيتم تنضيفه عندما تقوم انت باغلاق الform2 ، لانك عندما تقوم باغلاق الForm2 ، ستكون قد دمرت الclass الخاص به .. من هنا اقول لك صحيح كلامك ، ربما لايتم تدمير المتغير المعرف على مستوى الform الاساسي للتطبيق ، اذ ان المتغير المعرف على مستوى الform او (class) الاساسي في التطبيق ، لن يتم تنظيفه ما لم يتم اغلاق البرنامج .... طبعا فيه استثنائات لهذه الحالة مثل : اسناد Nothing الى المتغير العام ، وبهذا انت ببساطة قمت بتخليص المتغير المسكين من الكائن الذي يشير اليه ، فسيتم تنظيف الكائن الذي لم يعد احد يشير اليه وذلك دون الحاجة الى اغلاق البرنامج -- امل اني وضحت المسئلة بشكل جيد ، وتذكر موضوع الGarbge سهل جدا ولكن يجب عليك القراءة عنه بالتفصيل ، والاخ الوادي جزاه الله خيرا ماقصر معك RE: الكائنات والذاكرة - silverlight - 22-07-16 Control واحد سوف يغنيك عن 100 خاصة اذا كانوا من نفس النوع عموما عليك أن تقلق من كمية الصور و ليس من الكونترول هناك شئ اخر انا لا أفهم ماذا تقصد بكلامك انك لا تستطيع استخدام الامر Dispose لأنها مرئية علي الفورم رجاء التوضيح نصيحتي لك هي ان تضع فكرتك حيز التنفيذ أولا وبعد ذلك و أثناء التجارب و إن كان هناك مشاكل مع الذاكرة هنا عليك أن تقلق و تحاول أن تجد حلول للمشكلة RE: الكائنات والذاكرة - LoveVb - 22-07-16 الله يسعدكم ويوفقكم والف شكر لك اخوي الشاكي لله كانت الاجوبة هذه مهمه جدا لي ووقفتني لمشاريع والان سارتب الكود باستخدام متغيرات String قبل كنت احاول ان لا استخدمها وكان الكود طويل جدا اخي silverlight هل تقصد ان استخدم ListView افضل عند استخدام Dispose لكـنـترول على الفورم سيتم انهائه وسيختفى من على الفورم وشكرا على النصيحة شكرا لكم RE: الكائنات والذاكرة - LoveVb - 22-07-16 اخي الشاكي لله اعتقد انك نسيت الاجابة على السؤال الاخير هل يُفضل استخدام دالة في حلقة تكرارية ولديها بارمتر من نوع String او ماهو البديل لها - مثل القيام ببناء نص ام؟ RE: الكائنات والذاكرة - الشاكي لله - 22-07-16 ^ لم افهم ماتقصده بالضبط ارجو ان ترفق كود يوضح السؤال |