আমি বর্তমানে খুব কার্য সম্পাদনমূলক সমালোচনামূলক প্রোগ্রামে কাজ করছি এবং আমি যে পথটি অন্বেষণ করার সিদ্ধান্ত নিয়েছি তা আমার কর্মী থ্রেডের স্ট্যাকের আকার বাড়িয়ে তুলতে সাহায্য করতে পারে যা আমার কর্মী থ্রেডের আকার বাড়িয়ে তুলছে যাতে আমি বেশিরভাগ ডেটা ( float[]
গুলি) সরিয়ে নিতে পারি যা আমি অ্যাক্সেস করব স্ট্যাক (ব্যবহার করে stackalloc
)
আমি পড়েছি যে কোনও থ্রেডের জন্য ডিফল্ট স্ট্যাকের আকার 1 এমবি, সুতরাং আমার সমস্ত float[]
গুলি সরাতে আমাকে এই স্ট্যাকটি প্রায় 50 বার (50 এমবি to) প্রসারিত করতে হবে।
আমি বুঝতে পারি এটি সাধারণত "অনিরাপদ" হিসাবে বিবেচিত হয় এবং এটি প্রস্তাবিত নয়, তবে এই পদ্ধতির বিপরীতে আমার বর্তমান কোডটি চিহ্নিত করার পরে, আমি প্রক্রিয়াজাতকরণের গতিতে 530% বৃদ্ধি আবিষ্কার করেছি ! সুতরাং আমি আরও তদন্ত ছাড়াই কেবল এই বিকল্পটি দিয়ে যেতে পারি না, যা আমাকে আমার প্রশ্নের দিকে নিয়ে যায়; এত বড় আকারের স্ট্যাক বাড়ানোর সাথে কী কী ঝুঁকি রয়েছে (কী ভুল হতে পারে), এবং এই জাতীয় বিপদগুলি হ্রাস করতে আমার কী সাবধানতা অবলম্বন করা উচিত?
আমার পরীক্ষার কোড,
public static unsafe void TestMethod1()
{
float* samples = stackalloc float[12500000];
for (var ii = 0; ii < 12500000; ii++)
{
samples[ii] = 32768;
}
}
public static void TestMethod2()
{
var samples = new float[12500000];
for (var i = 0; i < 12500000; i++)
{
samples[i] = 32768;
}
}
Marshal.AllocHGlobal
কি ম্যানেজড মেমোরির বাইরেFreeHGlobal
ডেটা বরাদ্দ করতে ( খুব ভুলে যাবেন না ) ব্যবহার করে চেষ্টা করেছেন ? তারপরে একটিতে পয়েন্টারটি কাস্ট করুন এবং আপনার বাছাই করা উচিত। float*