। নেট প্রতিবিম্ব কত ব্যয়বহুল?


210

আমি প্রতিনিয়ত শুনতে পাই কতটা খারাপ প্রতিবিম্ব ব্যবহার করা হয়। আমি সাধারণত প্রতিচ্ছবি এড়ানোর জন্য এবং খুব কমই এমন পরিস্থিতিগুলি খুঁজে পাই যেখানে এটি ছাড়া আমার সমস্যা সমাধান করা অসম্ভব, আমি ভাবছিলাম ...

যারা অ্যাপ্লিকেশনগুলিতে প্রতিবিম্ব ব্যবহার করেছেন, আপনি কি পারফরম্যান্সের হিটগুলি পরিমাপ করেছেন এবং, এটি কি এত খারাপ?


আপনি এই প্রশ্নটিও দেখতে চাইতে পারেন। stackoverflow.com/questions/224232/...
smaclell

1
এপিআই ব্যবহার করুন quickflect.codeplex.com এ .com এটি গ্রাহকগণ / সেটটার্স / ইনভোকার্স এবং অন্যান্য কিছু স্টাফের জন্য 500x এর মত প্রতিবিম্বকে গতিবেগ করবে। উত্স এবং কীভাবে এটি কাজ করে সে সম্পর্কিত তথ্যও যদি আপনার এটি প্রসারিত করার প্রয়োজন হয়।
ব্র্যান্ডন মুর

3
2014 এ এই তথ্য কীভাবে চেক আউট করে? এই 4 বছরে কিছু পরিবর্তন হয়েছে?
আর্থার 11

1
একটি উদাহরণ বৈশিষ্ট্যের জন্য একটি মান নির্ধারণের সহজ কাজটি সোজা কোডিংয়ের চেয়ে প্রতিচ্ছবি (সম্পত্তিআইফোন.সেটভ্যালু (উদাহরণস্বরূপ, মান)) দিয়ে প্রায় 150 গুণ ধীর হয় এটি নেট নেট 4.0.০
থানাসিস আইওনিডিসে রয়েছে

উত্তর:


130

এইটা. তবে এটি আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে।

আমি অ্যাসেম্বলিসিগুলি (প্লাগইন) লোড করার জন্য প্রতিচ্ছবি ব্যবহার করি এবং এর কার্য সম্পাদন "পেনাল্টি" কোনও সমস্যা নয়, কারণ অ্যাপ্লিকেশন শুরুর সময় অপারেশনটি আমি কিছু করি।

যাইহোক, আপনি যদি প্রতিটি নেভিগেশন প্রতিবিম্ব কল সহ নেস্টেড লুপগুলির একটি সিরিজের অভ্যন্তরে প্রতিফলিত হন তবে আমি বলতে চাই যে আপনার কোডটি আবার দেখা উচিত :)

"বেশ কয়েকবার" ক্রিয়াকলাপের জন্য প্রতিফলন পুরোপুরি গ্রহণযোগ্য এবং আপনি এতে কোনও বিলম্ব বা সমস্যা লক্ষ্য করবেন না notice এটি একটি খুব শক্তিশালী প্রক্রিয়া এবং এটি এমনকি নেটও ব্যবহার করে, সুতরাং কেন আপনি এটি চেষ্টা করে দেখবেন না তা আমি দেখতে পাচ্ছি না।


আমি চেষ্টা করার পদ্ধতিতে ত্রুটি লগ করতে বর্তমান পদ্ধতির শ্রেণীর নাম, প্রতিবিম্বটি পেতে ব্যবহার করছি। লগিং ত্রুটি করার সময় ফাংশনটির নাম হার্ডকোডিং এড়াতে মূলত। আমার কি চিন্তা করা দরকার?
সংগ্রাম নানদখিল

@ সংগ্রামরাম না, ঠিক আছে
কার্তিক এএমআর

@ সংগ্রাম না, যদি না আপনার প্রচুর ত্রুটি হয় যা ক্রমাগত ধরার প্রয়োজন হয় যা অবশ্যই অন্যরকম সমস্যা হওয়া উচিত :)
মার্টিন মার্কনকিনি

5
@ সংগ্রাম আপনার ক্ষেত্রে প্রতিবিম্ব সম্পাদনের বিষয়টি হওয়া উচিত নয়, মনে হচ্ছে আপনি সরল পুরানো ব্যতিক্রমগুলি বাক্সের বাইরে আরও মার্জিত উপায়ে যা প্রদান করেছেন তা পুনরায় বাস্তবায়ন করার চেষ্টা করছেন ...
জেসেক গর্গো

152

তাঁর কথার দৈনন্দিন জিনিষ পারফরমেন্স , জেফ রিখটার শো প্রতিফলন দ্বারা একটি পদ্ধতি কলিং সম্পর্কে যে 1000 গুণ ধীর সাধারণত কলিং হয়।

জেফের পরামর্শ: যদি আপনাকে একাধিকবার পদ্ধতিটি কল করতে হয়, এটির জন্য একবার প্রতিবিম্বটি ব্যবহার করুন, তারপরে এটি একটি প্রতিনিধিকে অর্পণ করুন এবং তারপরে ডেলিগেটকে কল করুন।


18
আমিও ডেভস্কুয়রিতে অংশ নিয়েছি এবং .NET 3.5 এর জন্য এই ফলাফলগুলির সাথে একমত হয়েছি। .NET 4 এর জন্য ডেভস্ক্রিয় পারফরম্যান্স বেঞ্চমার্ক প্রোগ্রামটি পুনরায় সংশোধন করা ব্যাপক উন্নতি দেখায়! ব্যয় কমে যায় 100 গুণ ধীর গতিতে। টাইপ অফ () এর জন্য প্রতিচ্ছবি ব্যবহার করে .NET 3.5 এবং। নেট 4 এর মধ্যে অপরিবর্তিত রয়েছে
জন উইগার

61

প্রতিবিম্ব কর্মক্ষমতা বাস্তবায়নের উপর নির্ভর করবে (পুনরাবৃত্ত কলগুলি ক্যাশে করা উচিত যেমন entity.GetType().GetProperty("PropName"):)। যেহেতু আমি প্রতিদিন ভিত্তি করে দেখি বেশিরভাগ প্রতিবিম্বটি ডেটা পাঠক বা অন্যান্য সংগ্রহস্থল ধরণের কাঠামোগত সত্তাগুলি সঞ্চিত করতে ব্যবহৃত হয় আমি যখন কোনও বস্তুর বৈশিষ্ট্য পেতে বা সেট করতে ব্যবহৃত হয় তখন বিশেষভাবে প্রতিচ্ছবিতে পারফরম্যান্সকে বেঞ্চমার্ক করার সিদ্ধান্ত নিয়েছিলাম।

আমি একটি পরীক্ষা তৈরি করেছি যা আমি ন্যায্য বলে মনে করি যেহেতু এটি সমস্ত পুনরাবৃত্তি কল এবং কেবল সেটওয়ালু বা গেটভ্যালু কলকে কেবলমাত্র ক্যাশ করে। পারফরম্যান্স পরীক্ষার জন্য সমস্ত উত্স কোডটি এখানে বিটবাকেটে রয়েছে: https://bitbucket.org/grenade/accessortest । যাচাই-বাছাই স্বাগত এবং উত্সাহিত হয়।

আমি যে উপসংহারে এসেছি তা হ'ল এটি ব্যবহারিক নয় এবং প্রতিচ্ছবি বাস্তবায়নটি ভালভাবে সম্পন্ন হওয়ার সাথে সাথে এমন একটি ডেটা অ্যাক্সেস লেয়ারের প্রতিফলন অপসারণের লক্ষণীয় পারফরম্যান্সের উন্নতি সরবরাহ করে না যা প্রতি সময়ে প্রতিচ্ছবি বাস্তবায়ন ভালভাবে সম্পন্ন হওয়ার সাথে সাথে 100,000 সারি থেকেও কম ফিরে আসে।

জনসংখ্যার সত্তার (x) বিপরীতে সময়ের গ্রাফ (y)

উপরের গ্রাফটি আমার সামান্য বেঞ্চমার্কের আউটপুট প্রদর্শন করে এবং দেখায় যে প্রতিরোধগুলি প্রতিফলনকে ছাড়িয়ে যায় এমন পদ্ধতিগুলি কেবলমাত্র 10,000,000 চক্রের চিহ্নের পরে লক্ষণীয়ভাবে এটি করে। বেশিরভাগ ডালগুলি একসাথে কেবল কয়েক শতাধিক বা সম্ভবত কয়েক হাজার সারি ফেরত দেয় এবং এই স্তরে প্রতিবিম্বটি কেবল সূক্ষ্ম সম্পাদন করে।


9
অগত্যা। আপনার ডালের রূপান্তরগুলি কেবল কয়েক হাজার আইটেমের মধ্যে থাকতে পারে তবে আপনার অ্যাপ্লিকেশন ব্যবহার করে সমবর্তী ব্যবহারকারীরা (এটি যদি ওয়েব হয়) দ্বারা এটির গুণ বৃদ্ধি করুন এবং এটি মিলিয়নের আইটেমগুলিতে রূপান্তর করতে চাইলে এটি যুক্ত হতে পারে। নির্দিষ্ট পদ্ধতিটি যদি 100 গুণ ধীর হয় তবে ছোট এবং বড় সেটগুলিতে এটি এত ধীর হবে। ধীরে ধীরে ধীর।
রবার্ট করিতনিক

@ রবার্টকরিটনিক এটি ধরেই নিয়েছে যে আপনার সার্ভারে থাকা ওয়েব পদ্ধতিগুলি
অ্যাসিনক্রোনাস

@ কুরেন অ্যাসিনক্রোনটিটি প্রতিবিম্বের পরিবর্তে সার্ভার সংস্থানকে প্রভাবিত করে না। অ্যাসিঙ্ক্রোনাস ওয়েব পদ্ধতি অবশ্যই আরও বেশি ব্যবহারকারীদের পরিবেশন করতে সক্ষম হবে, তবে প্রতিবিম্ব এখনও ধীর থাকবে। এবং নিজেই প্রতিস্থাপন এএফএইকি যাইহোক একটি সংক্রামক প্রক্রিয়া। অন্যদিকে ডেটা আনার একমাত্র অংশটি অ্যাসিক্রোনাস ডিজাইনের সাথে সুন্দরভাবে খেলবে।
রবার্ট কোরিটনিক

3
চার্টে হাইপার পদ্ধতি কী? এটি প্রতিবিম্বকের থেকে আলাদা কীভাবে?
ব্রায়ান কিংবদন্তি

: আমি এই @LoneCoder রেফারেন্সড উচিত codeproject.com/Articles/18450/... দ্বারা stackoverflow.com/users/23354/marc-gravell
গ্রেনেড


12

আমার সবচেয়ে প্রাসঙ্গিক অভিজ্ঞতাটি ছিল বৃহত্তর অবজেক্টের মডেল সম্পত্তি ভিত্তিতে একই ধরণের যে কোনও দুটি ডেটা সত্তাকে তুলনা করার জন্য কোড লেখা। এটি কাজ করে পেয়েছে, চেষ্টা করেছে, কুকুরের মতো ছুটে গেছে, স্পষ্টতই।

আমি হতাশ হয়ে পড়েছিলাম, তারপরে রাতারাতি বুঝতে পারলাম যে যুক্তি বদলানো ছাড়াও, আমি একই অ্যালগরিদমটি তুলনা করার জন্য স্বতঃ-উত্পাদন পদ্ধতিতে ব্যবহার করতে পারি তবে বৈশিষ্ট্যগুলিতে স্থিতিশীলভাবে অ্যাক্সেস করতে পারি। এই উদ্দেশ্যে কোডটি মানিয়ে নিতে মোটেই সময় লাগেনি এবং স্থির কোডের সাথে সত্তাগুলির গভীর সম্পত্তি-ভিত্তিক তুলনা করার ক্ষমতা আমার ছিল যা যখনই বস্তুর মডেল পরিবর্তিত হবে তখন একটি বোতামের ক্লিকে আপডেট করা যেতে পারে।

আমার বক্তব্যটি: সহকর্মীদের সাথে কথোপকথনে যেহেতু আমি বেশ কয়েকবার উল্লেখ করেছি যে তাদের প্রতিবিম্বের ব্যবহারটি রানটাইম ক্রিয়াকলাপ সম্পাদনের পরিবর্তে সংকলনের জন্য কোড স্বয়ংক্রিয়ভাবে তৈরি করা হতে পারে এবং এটি প্রায়শই বিবেচ্য।


ভিজ্যুয়াল স্টুডিওর এমন দুর্দান্ত টেম্পলেট সমর্থন রয়েছে তা বিবেচনা করে কোড কোড তৈরির ব্যবহারের এটি ব্যবহারিক উপায়
সেবাস্তিয়ান

12

ব্যাপকভাবে নয়। ডেস্কটপ বিকাশে এটি নিয়ে আমার কখনও সমস্যা হয়নি, যতক্ষণ না মার্টিনের বক্তব্য, আপনি এটিকে নিরীহ জায়গায় ব্যবহার করছেন। আমি শুনেছি অনেক লোক ডেস্কটপ বিকাশে এর কার্যকারিতা সম্পর্কে সম্পূর্ণ যুক্তিযুক্ত ভয় পেয়ে থাকে।

ইন কম্প্যাক্ট ফ্রেমওয়ার্ক (যা আমি সাধারণত নই) যদিও, এটা প্রায় কাছাকাছি অভিশাপ এবং অধিকাংশ ক্ষেত্রে প্লেগ মত এড়িয়ে চলা উচিত। আমি এখনও এটি খুব কম সময়েই ব্যবহার করে পালাতে পারি, তবে এর প্রয়োগ সম্পর্কে আমাকে খুব সতর্ক থাকতে হবে যা উপায় কম মজাদার। :(


5
আমাকে একটি নতুন শব্দ শেখানোর জন্য +1: অ্যানথেমা। অযৌক্তিক ভয় উল্লেখ করার জন্যও। আমি এমন প্রোগ্রামারদের ভয় করি যারা অযৌক্তিকভাবে ভয় পায় - এটি দেখায় যে তারা সত্যিই জানে না তারা কী করছে এবং কেবল অন্য লোকেরা তাদের যা বলে তা কী করে তা নির্ভর করে। কাশি কার্গো
কাল্ট

1
আহহহ কার্গো কাল্ট। কৌতূহলী মানব আচরণের একটি সূক্ষ্ম উদাহরণ রয়েছে।
কুইবলসোম

10

এটি যথেষ্ট খারাপ যে আপনাকে পারফরম্যান্স-সমালোচনামূলক কোডের জন্য .NET গ্রন্থাগারগুলির দ্বারা অভ্যন্তরীণভাবে প্রতিবিম্বের জন্যও উদ্বিগ্ন হতে হবে।

নিম্নলিখিত উদাহরণটি অপ্রচলিত - সময়ে (২০০৮) এ সত্য, তবে আরও সাম্প্রতিক সিএলআর সংস্করণে অনেক আগেই ঠিক করা হয়েছিল। সাধারণভাবে প্রতিবিম্ব এখনও কিছুটা ব্যয়বহুল জিনিস, যদিও!

কেস পয়েন্ট: আপনার উচ্চ-পারফরম্যান্স কোডে লক (সি #) / সিঙ্কলক (ভিবি.এনইটি) বিবৃতিতে কখনই "অবজেক্ট" হিসাবে ঘোষিত সদস্য ব্যবহার করা উচিত নয়। কেন? কারণ সিএলআর কোনও মান ধরণের লক করতে পারে না, যার অর্থ এটি কোনও রান-টাইম প্রতিচ্ছবি টাইপ পরীক্ষা করে দেখতে হবে যে আপনার অবজেক্টটি আসলে কোনও রেফারেন্স টাইপের পরিবর্তে কোনও মান টাইপ কিনা।


13
পরিষ্কার হতে, একটি প্রতিবিম্ব প্রকার চেক দ্রুত।
জিমি

1
এই জাতীয় 'পারফরম্যান্স সমালোচনামূলক কোড' এর জন্য আপনার কি শুরু থেকে নেট শুরু করা উচিত?
Seph

1
@ সেফ: .NET এর গতিশীল / প্রতিচ্ছবি অংশগুলি, না। তবে সাধারণ সি # /। নেট, কেন নয়? সি ++ বনাম সি # স্পিডআপগুলি অ্যাপ্লিকেশন স্তরে প্রান্তিক (সি ++ আরও নিবিড় গণিতের রুটিনে কয়েক% দ্রুত)। এবং আমি অনুমান করছি আপনি সমাবেশের পরামর্শ দিচ্ছেন না ...
ডিপস্পেস 101

একটি বক্সযুক্ত মান ধরণের (যেমন। অবজেক্ট) লক করা যায়। @ ব্রাইস ওয়াগনার সঠিক।
পাখি

1
সুস্পষ্ট হওয়ার জন্য (আমার কাছে), এটি বলা আরও সঠিক যে উত্তরটি "অপ্রচলিত", "স্পষ্ট বাজে" নয়। লক (আপত্তি) এর আচরণ সম্পর্কে আমার মন্তব্যগুলি লেখার সময় সঠিক ছিল, তবে সিএলআর-এর বাস্তবায়ন-নির্দিষ্ট আচরণ দীর্ঘস্থায়ী।
McKenzieG1

5

প্রোগ্রামিংয়ের সমস্ত জিনিসের মতো আপনাকে যে কোনও উপকারের সাথে পারফরম্যান্স ব্যয়ের ভারসাম্য বজায় রাখতে হবে। প্রতিচ্ছবি যত্ন সহ যখন ব্যবহৃত হয় তখন একটি অমূল্য সরঞ্জাম। আমি সি # তে একটি ও / আর ম্যাপিং লাইব্রেরি তৈরি করেছি যা বাইন্ডিংয়ের প্রতিচ্ছবি ব্যবহার করে। এটি দুর্দান্তভাবে কাজ করেছে। বেশিরভাগ প্রতিবিম্ব কোড কেবল একবার কার্যকর করা হয়েছিল, সুতরাং যে কোনও পারফরম্যান্স হিট বেশ ছোট ছিল, তবে সুবিধাগুলি দুর্দান্ত ছিল। যদি আমি একটি নতুন fandangled বাছাই করা অ্যালগরিদম লিখতে থাকি, আমি সম্ভবত প্রতিচ্ছবি ব্যবহার করব না, কারণ এটি সম্ভবত খুব কম স্কেল হবে।

আমি প্রশংসা করি যে আমি এখানে আপনার প্রশ্নের সঠিক উত্তর দিইনি। আমার বক্তব্যটি আসলে এটি কোনও বিষয় নয়। যেখানে উপযুক্ত প্রতিচ্ছবি ব্যবহার করুন। এটি কেবলমাত্র অন্য ভাষার বৈশিষ্ট্য যা আপনাকে কখন এবং কখন ব্যবহার করতে হবে তা শিখতে হবে।


3

আপনি যদি ঘন ঘন অবজেক্ট তৈরির জন্য এটি ব্যবহার করেন তবে প্রতিচ্ছবিটি পারফরম্যান্সে লক্ষণীয় প্রভাব ফেলতে পারে। আমি কম্পোজিট ইউআই অ্যাপ্লিকেশন ব্লকের ভিত্তিতে অ্যাপ্লিকেশন তৈরি করেছি যা প্রতিফলনের উপর নির্ভর করে। প্রতিবিম্বের মাধ্যমে অবজেক্ট তৈরির সাথে সম্পর্কিত একটি লক্ষণীয় পারফরম্যান্স অবক্ষয় ছিল।

তবে বেশিরভাগ ক্ষেত্রেই প্রতিবিম্ব ব্যবহারে কোনও সমস্যা নেই। আপনার কেবলমাত্র যদি কিছু অ্যাসেম্বলি পরিদর্শন করা হয় তবে আমি মনো-সিসিলের সুপারিশ করব যা খুব হালকা ও দ্রুত


3

প্রতিচ্ছবি ব্যয়বহুল কারণ আপনি যখন পরামিতিগুলির তালিকার সাথে মেলে এমন কোনও পদ্ধতির জন্য কোনও অনুরোধ করেন তখন রানটাইমটি অবশ্যই অনেকগুলি চেক করে তোলে। কোথাও গভীর ভিতরে, কোড বিদ্যমান রয়েছে যা কোনও প্রকারের জন্য সমস্ত পদ্ধতিতে লুপ করে, তার দৃশ্যমানতা যাচাই করে, রিটার্নের ধরণটি পরীক্ষা করে এবং প্রতিটি প্যারামিটারের ধরনও পরীক্ষা করে। এই সমস্ত জিনিস সময় ব্যয়।

আপনি যখন এই পদ্ধতিটি কার্যকর করেন তখন অভ্যন্তরীণভাবে এমন কিছু কোড থাকে যা এমন স্টাফ করে যা প্রকৃত টার্গেট পদ্ধতিটি কার্যকর করার আগে আপনি পরামিতিগুলির একটি সামঞ্জস্যপূর্ণ তালিকা পাস করেছিলেন checking

যদি সম্ভব হয় তবে সর্বদা পরামর্শ দেওয়া হয় যে কেউ যদি ভবিষ্যতে ক্রমাগত এটি পুনরায় ব্যবহার করতে চলেছে তবে পদ্ধতি হ্যান্ডেলটিকে ক্যাশে করে। সমস্ত ভাল প্রোগ্রামিং টিপসের মতো, নিজেকে পুনরাবৃত্তি করা এড়াতে প্রায়শই এটি বোধগম্য হয়। এই ক্ষেত্রে নির্দিষ্ট পরামিতিগুলির সাথে নিয়মিত পদ্ধতিটি অনুসন্ধান করা এবং তারপরে এটি প্রতিটি এবং প্রতিটি সময় কার্যকর করা অযথাই হবে।

উত্সটির আশেপাশে পোকে এবং কী হচ্ছে তা একবার দেখুন।


3

সবকিছুর মতো, পরিস্থিতিটি মূল্যায়ন করার বিষয়টিও। ইন DotNetNuke মোটামুটি কোর উপাদান বলা আছে FillObjectযে ব্যবহারসমূহ প্রতিফলন datarows থেকে বস্তু পূরণ করতে।

এটি মোটামুটি একটি সাধারণ পরিস্থিতি এবং এমএসডিএন-তে একটি নিবন্ধ রয়েছে, এটিএসপি.নেট ফর্ম নিয়ন্ত্রণগুলিতে পারফরম্যান্সের বিষয়গুলি অন্তর্ভুক্ত করে এমন বিজনেস অবজেক্টগুলিকে আবদ্ধ করে Using

পারফরম্যান্স একদিকে রাখুন, সেই বিশেষ দৃশ্যে প্রতিবিম্বটি ব্যবহার করতে আমি পছন্দ করি না তা হ'ল কোডটি তাত্ক্ষণিকভাবে বোঝার ক্ষমতা হ্রাস করতে পারে যা আমার জন্য আপনি চেষ্টা করার উপযুক্ত বলে মনে হয় না যখন আপনি বিবেচনা করেন আপনিও সংকলন হারাবেন টাইম সুরক্ষা হিসাবে দৃ strongly ়ভাবে টাইপ করা ডেটাসেট বা লিনকিউ থেকে এসকিউএল এর মতো কোনও কিছুর বিপরীতে ।


2

প্রতিচ্ছবি আপনার অ্যাপ্লিকেশন এর কর্মক্ষমতা মারাত্মকভাবে ধীর করে না। প্রতিবিম্বটি ব্যবহার না করে আপনি কিছু কিছু দ্রুত করতে সক্ষম হতে পারেন তবে যদি কিছু কার্যকারিতা অর্জনের প্রতিচ্ছবি হ'ল সহজ উপায় হয় তবে তা ব্যবহার করুন। আপনি যদি প্রতিচ্ছবি থেকে দূরে থাকেন তবে সর্বদা আপনার কোডটি রিফ্যাক্টর করতে পারেন যদি এটি কোনও সমস্যা হয়ে যায়।


1

আমি মনে করি আপনি উত্তরটি খুঁজে পাবেন, এটি নির্ভর করে। আপনি যদি এটি আপনার টাস্ক-তালিকা অ্যাপ্লিকেশনটিতে রাখতে চান তবে এটি কোনও বড় বিষয় নয়। আপনি যদি এটি ফেসবুকের অধ্যবসায় গ্রন্থাগারে রাখতে চান তবে এটি বড় কথা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.