আমি Lazy<T>
আমার নিজস্ব কোডের কার্যকারিতা উন্নত করতে (এবং এটি সম্পর্কে আরও কিছুটা জানতে) বৈশিষ্ট্যগুলি ব্যবহার করার বিষয়ে বিবেচনা করছি। আমি কখন এটি ব্যবহার করব সে সম্পর্কে উত্তরগুলি খুঁজতে এখানে এসেছি তবে মনে হয় যে আমি যেখানেই যাচ্ছি সেখানে এই জাতীয় বাক্যাংশ রয়েছে:
একটি বৃহত বা সংস্থান-নিবিড় বস্তুর সৃষ্টি স্থগিত করতে অলস সূচনা ব্যবহার করুন বা কোনও সংস্থান-নিবিড় কার্য সম্পাদন বিশেষত যখন প্রোগ্রামের জীবদ্দশায় এই জাতীয় সৃষ্টি বা সম্পাদন না ঘটে execution
থেকে দুটিই MSDN অলস <টি> ক্লাস
আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি কারণ লাইনটি কোথায় আঁকবেন তা আমি নিশ্চিত নই। উদাহরণস্বরূপ, আমি লিনিয়ার ইন্টারপোলেশনকে মোটামুটি দ্রুত গণনা হিসাবে বিবেচনা করি তবে যদি আমার এটি করার প্রয়োজন না হয় তবে অলস সূচনাটি আমাকে এটি করা এড়াতে সহায়তা করতে পারে এবং এটি কি মূল্যবান?
শেষ পর্যন্ত আমি আমার নিজের পরীক্ষার চেষ্টা করার সিদ্ধান্ত নিয়েছি এবং আমি ভেবেছিলাম যে ফলাফলগুলি এখানে ভাগ করে নেব। দুর্ভাগ্যক্রমে আমি এই ধরণের পরীক্ষাগুলি করার ক্ষেত্রে সত্যই বিশেষজ্ঞ নই এবং তাই উন্নতিগুলির প্রস্তাব দেওয়া মন্তব্য পেয়ে আমি আনন্দিত।
বিবরণ
আমার ক্ষেত্রে, আমি বিশেষভাবে আগ্রহী ছিলাম কিনা তা দেখার আগ্রহ ছিল যে আমার কোডের একটি অংশ উন্নত করতে অলস সম্পত্তিগুলি সাহায্য করতে পারে যা প্রচুর পরিমাণে অন্তরঙ্গ (এটি বেশিরভাগ অব্যবহৃত রয়েছে) করে এবং তাই আমি একটি পরীক্ষা তৈরি করেছি যা 3 পদ্ধতির সাথে তুলনা করে।
আমি প্রতিটি পদ্ধতির জন্য 20 টি পরীক্ষা বৈশিষ্ট্য (তাদের টি-সম্পত্তি বলতে পারি) দিয়ে একটি পৃথক পরীক্ষার শ্রেণি তৈরি করেছি।
- গেটইন্টার্প ক্লাস: প্রতিবার কোনও টি-সম্পত্তি পাওয়ার পরে লিনিয়ার ইন্টারপোলেশন চালায় ।
- ইনিআইন্টার্প ক্লাস: কনস্ট্রাক্টরের প্রত্যেকের জন্য লিনিয়ার ইন্টারপোলেশন চালিয়ে টি-প্রোপার্টি শুরু করে। গেটটি কেবল একটি ডাবল ফেরত দেয়।
- ইনিলসি ক্লাস: টি-বৈশিষ্ট্যগুলিকে অলস বৈশিষ্ট্য হিসাবে সেট করুন যাতে সম্পত্তিটি প্রথম পাওয়া গেলে লিনিয়ার ইন্টারপোলেশন একবার চালানো হয়। পরবর্তী গেসগুলি কেবল ইতিমধ্যে গণনা করা ডাবলকে ফিরিয়ে আনতে হবে।
পরীক্ষার ফলাফলগুলি এমএসে পরিমাপ করা হয় এবং এটি 50 টি ইনস্ট্যান্টেশন বা 20 টি সম্পত্তি পায় property প্রতিটি পরীক্ষা তখন 5 বার চালানো হয়েছিল।
পরীক্ষার 1 ফলাফল: ইনস্ট্যান্টেশন (গড় 50 টি ইনস্ট্যান্টেশন)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.005668 0.005722 0.006704 0.006652 0.005572 0.0060636 6.72
InitInterp 0.08481 0.084908 0.099328 0.098626 0.083774 0.0902892 100.00
InitLazy 0.058436 0.05891 0.068046 0.068108 0.060648 0.0628296 69.59
পরীক্ষা 2 ফলাফল: প্রথম পান (গড়ে 20 টি সম্পত্তি পাওয়া যায়)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.263 0.268725 0.31373 0.263745 0.279675 0.277775 54.38
InitInterp 0.16316 0.161845 0.18675 0.163535 0.173625 0.169783 33.24
InitLazy 0.46932 0.55299 0.54726 0.47878 0.505635 0.510797 100.00
পরীক্ষা 3 ফলাফল: দ্বিতীয় প্রাপ্তি (গড় 20 টি সম্পত্তি পায়)
Class 1 2 3 4 5 Avg %
------------------------------------------------------------------------
GetInterp 0.08184 0.129325 0.112035 0.097575 0.098695 0.103894 85.30
InitInterp 0.102755 0.128865 0.111335 0.10137 0.106045 0.110074 90.37
InitLazy 0.19603 0.105715 0.107975 0.10034 0.098935 0.121799 100.00
পর্যবেক্ষণ
GetInterp
প্রত্যাশা অনুযায়ী তাত্ক্ষণিকভাবে দ্রুত হয় কারণ এটি কিছু করছে না। InitLazy
যতো তাড়াতাড়ি instantiate হয় InitInterp
বোঝা যায় যে অলস বৈশিষ্ট্য স্থাপনে ওভারহেড দ্রুত আমার রৈখিক ক্ষেপক হিসাব চেয়ে। যাইহোক, আমি এখানে কিছুটা বিভ্রান্ত কারণInitInterp
20 টি রৈখিক ইন্টারপোলেশন করা উচিত (এটির টি-প্রোপার্টি সেট আপ করতে) তবে এটি কেবলমাত্র 0.09 এমএস নিচ্ছে ইনস্ট্যান্টিয়েটে (পরীক্ষা 1), তুলনায়GetInterp
মাত্র এক লিনিয়ার ইন্টারপোলেশন করতে 0.28 এমএস লাগবে প্রথমবার (পরীক্ষা 2), এবং দ্বিতীয় বার এটি করতে 0.1 এমএস (পরীক্ষা 3)।
প্রথমবার কোনও সম্পত্তি পেতে InitLazy
প্রায় 2 গুণ বেশি সময় লাগেGetInterp
InitInterp
এটি দ্রুততম, কারণ এটি ইনস্ট্যান্টেশনের সময় এর বৈশিষ্ট্যগুলি জনবসতিযুক্ত করে। (কমপক্ষে এটি করা উচিত ছিল তবে এটি কেন একক রৈখিক দ্রবীণের চেয়ে তাত্ক্ষণিক ফলাফল এত তাড়াতাড়ি হয়েছিল? ঠিক কখন এই ঘূর্ণনগুলি করছে?)
দুর্ভাগ্যক্রমে দেখে মনে হচ্ছে আমার পরীক্ষাগুলিতে কিছু স্বয়ংক্রিয় কোড অপ্টিমাইজেশন চলছে। GetInterp
দ্বিতীয়বারের মতো প্রথমবার কোনও সম্পত্তি পেতে একই সময় নেওয়া উচিত , তবে এটি 2xেরও বেশি দ্রুত দেখানো হচ্ছে। দেখে মনে হচ্ছে যে এই অপ্টিমাইজেশনটি অন্যান্য শ্রেণীর উপরও প্রভাব ফেলছে কারণ তারা সকলেই পরীক্ষার জন্য একই পরিমাণ সময় নিচ্ছে 3 However তবে, এই ধরনের অপটিমেশনগুলি আমার নিজস্ব প্রযোজনা কোডেও নিতে পারে যা একটি গুরুত্বপূর্ণ বিবেচনাও হতে পারে।
উপসংহার
কিছু ফলাফল প্রত্যাশিত হিসাবে প্রত্যাশার সাথে সাথে, কিছু খুব আকর্ষণীয় অপ্রত্যাশিত ফলাফল সম্ভবত কোড অপটিমাইজেশনের কারণেও রয়েছে। এমনকি নির্মাত্রে অনেক কাজ করছে বলে মনে হচ্ছে এমন ক্লাসগুলির জন্যও তাত্ক্ষণিক ফলাফলগুলি দেখায় যে তারা দ্বিগুণ সম্পত্তি পাওয়ার তুলনায় এখনও তৈরি করতে খুব দ্রুত হতে পারে। যদিও এই ক্ষেত্রে বিশেষজ্ঞরা আরও নিখুঁতভাবে মন্তব্য করতে এবং তদন্ত করতে সক্ষম হবেন, আমার ব্যক্তিগত অনুভূতিটি হ'ল সেখানেও কী ধরনের আশাবাদী ঘটনাগুলি ঘটতে পারে তা পরীক্ষা করার জন্য আমাকে আবার এই পরীক্ষাটি করা প্রয়োজন তবে আমার প্রোডাকশন কোডে। যাইহোক, আমি প্রত্যাশা করছি যে InitInterp
এটি যাওয়ার উপায় হতে পারে।
get { if (foo == null) foo = new Foo(); return foo; }
। এবং এটি ব্যবহারের জন্য লক্ষ লক্ষ সম্ভাব্য জায়গা রয়েছে ...