আরেকটি বিষয়: আপনি প্রতিবিম্ব ব্যবহার করতে পারেন। যদি আপনি এটি যথাযথভাবে ক্যাশে করেন, তবে এটি 5,6 সেকেন্ডের মধ্যে 1,000,000 অবজেক্টের ক্লোন করবে (দুঃখের সাথে, অভ্যন্তরীণ বস্তুগুলির সাথে 16.4 সেকেন্ড)।
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Person
{
...
Job JobDescription
...
}
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Job
{...
}
private static readonly Type stringType = typeof (string);
public static class CopyFactory
{
static readonly Dictionary<Type, PropertyInfo[]> ProperyList = new Dictionary<Type, PropertyInfo[]>();
private static readonly MethodInfo CreateCopyReflectionMethod;
static CopyFactory()
{
CreateCopyReflectionMethod = typeof(CopyFactory).GetMethod("CreateCopyReflection", BindingFlags.Static | BindingFlags.Public);
}
public static T CreateCopyReflection<T>(T source) where T : new()
{
var copyInstance = new T();
var sourceType = typeof(T);
PropertyInfo[] propList;
if (ProperyList.ContainsKey(sourceType))
propList = ProperyList[sourceType];
else
{
propList = sourceType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
ProperyList.Add(sourceType, propList);
}
foreach (var prop in propList)
{
var value = prop.GetValue(source, null);
prop.SetValue(copyInstance,
value != null && prop.PropertyType.IsClass && prop.PropertyType != stringType ? CreateCopyReflectionMethod.MakeGenericMethod(prop.PropertyType).Invoke(null, new object[] { value }) : value, null);
}
return copyInstance;
}
আমি ওয়াচচার ক্লাসটি ব্যবহার করে এটি একটি সহজ উপায়ে পরিমাপ করেছি।
var person = new Person
{
...
};
for (var i = 0; i < 1000000; i++)
{
personList.Add(person);
}
var watcher = new Stopwatch();
watcher.Start();
var copylist = personList.Select(CopyFactory.CreateCopyReflection).ToList();
watcher.Stop();
var elapsed = watcher.Elapsed;
ফলস্বরূপ : অভ্যন্তরীণ অবজেক্টের সাথে পার্সনআইন্সট্যান্স - ১.4.৪, পার্সোনআইনস্ট্যান্স = নাল - ৫..6
কপিফ্যাক্টরিটি কেবলমাত্র আমার পরীক্ষার ক্লাস যেখানে আমার অভিব্যক্তি ব্যবহার সহ ডজন ডজন পরীক্ষা রয়েছে। আপনি এটি কোনও এক্সটেনশনে বা যাই হোক না কেন অন্য আকারে প্রয়োগ করতে পারেন। ক্যাচিং সম্পর্কে ভুলবেন না
আমি এখনও সিরিয়ালাইজিং পরীক্ষা করিনি, তবে এক মিলিয়ন ক্লাস নিয়ে উন্নতির বিষয়ে সন্দেহ করছি। আমি দ্রুত কিছু প্রোটোবুফ / নিউটন চেষ্টা করব।
PS: সরলতার পড়ার খাতিরে, আমি এখানে কেবল অটো-সম্পত্তি ব্যবহার করেছি। আমি ফিল্ডইনফো দিয়ে আপডেট করতে পারলাম, বা আপনার নিজের দ্বারা এটি সহজেই প্রয়োগ করা উচিত।
আমি সম্প্রতি বক্সের বাইরে ডিপক্লোন ফাংশন দিয়ে প্রোটোকল বাফার সিরিয়ালাইজার পরীক্ষা করেছি । এটি মিলিয়ন সাধারণ বস্তুগুলিতে 4.2 সেকেন্ডের সাথে জয়ী হয়, তবে যখন এটি অভ্যন্তরীণ বস্তুর আসে তখন এটি 7.4 সেকেন্ডের ফলাফলের সাথে জয়ী হয়।
Serializer.DeepClone(personList);
সংক্ষিপ্তসার: আপনার যদি ক্লাসে অ্যাক্সেস না থাকে তবে এটি সাহায্য করবে। অন্যথায় এটি বস্তুর গণনার উপর নির্ভর করে। আমি মনে করি আপনি 10,000 টি অবধি অবধি প্রতিবিম্ব ব্যবহার করতে পারেন (সম্ভবত কিছুটা কম) তবে এর চেয়ে বেশি প্রোটোকল বাফার সিরিয়ালাইজার আরও ভাল সম্পাদন করবে।