java - ByteBuffer.allocate() বনাম। ByteBuffer.allocateDirect()




performance nio (3)

যেহেতু DirectByteBuffers OS লেভেলে সরাসরি মেমরি ম্যাপিং হয়

তারা না। তারা কেবলমাত্র স্বাভাবিক অ্যাপ্লিকেশন প্রক্রিয়া মেমরি, তবে জাভা জিসি সময় স্থানান্তর সাপেক্ষে যা JNI স্তরটির ভিতরে কিছু সহজ করে তোলে। আপনি কি বর্ণনা MappedByteBuffer প্রযোজ্য।

এটি পেতে / কল কল সঙ্গে দ্রুত সঞ্চালন করবে যে

উপসংহার প্রিমিয়ার থেকে অনুসরণ করে না; প্রিমিয়ার মিথ্যা; এবং উপসংহার মিথ্যা। একবার আপনি জেএনআই লেয়ারের ভিতরে ঢুকে পড়েন এবং যদি আপনি একই DirectByteBuffer থেকে পড়েন এবং লেখেন তবে তারা খুব দ্রুত হয় কারণ ডেটা কখনও DirectByteBuffer সীমানা অতিক্রম করতে পারে না।

allocate() বা allocateDirect() , যে প্রশ্ন।

কিছু বছর ধরে আমি এখন ভাবছি যে ডাইরেক্টবিটবফারগুলি OS লেভেলে সরাসরি মেমরি ম্যাপিংয়ের কারণে, এটি HeapByteBuffer তুলনায় HeapByteBuffer / put কলগুলির সাথে দ্রুত সঞ্চালন করবে। আমি এখন পর্যন্ত পরিস্থিতি সম্পর্কে সঠিক বিবরণ খুঁজে বের করতে সত্যিই আগ্রহী ছিলাম না। আমি জানতে চাই যে কোন ধরনের দুই ধরনের ByteBuffer দ্রুত এবং কোন অবস্থায়।


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


রন হিটস তাঁর চমৎকার বই জাভা এনআইওতে বলেছিলেন যে আমি যা মনে করি তা আপনার প্রশ্নের উত্তরের উত্তর হতে পারে:

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

এই কারণে, একটি সরাসরি বাফার ধারণা চালু করা হয়। সরাসরি বাফার চ্যানেল এবং নেটিভ I / O রুটিনগুলির সাথে মিথস্ক্রিয়া করার উদ্দেশ্যে তৈরি হয়। তারা একটি মেমরি এলাকায় বাইট উপাদানের সংরক্ষণ করার জন্য একটি ভাল প্রচেষ্টা করে যা একটি চ্যানেল সরাসরি বা কাঁচা, সরাসরি কোড ব্যবহার করে অ্যাক্সেস সিস্টেমকে ড্রেন বা মেমরি এলাকাটি পূরণ করতে বলার জন্য স্থানীয় কোড ব্যবহার করে অ্যাক্সেস করতে পারে।

সরাসরি বাইট বাফারগুলি সাধারণত I / O ক্রিয়াকলাপগুলির জন্য সর্বোত্তম পছন্দ। নকশা দ্বারা, তারা JVM এ উপলব্ধ সবচেয়ে কার্যকর I / O প্রক্রিয়া সমর্থন করে। Nondirect বাইট বাফার চ্যানেল পাস করা যেতে পারে, কিন্তু এটি একটি কর্মক্ষমতা শাস্তি বহন করতে পারে। একটি ন্যডাইরেক্ট বাফারের জন্য এটি একটি স্থানীয় আই / ও ক্রিয়াকলাপের লক্ষ্য হিসাবে সাধারণত সম্ভব নয়। আপনি যদি লেখার জন্য একটি চ্যানেলের মধ্যে একটি নন্দনবিহীন বাইটবফার বস্তুটি পাস করেন, তবে চ্যানেলটি প্রতিটি কলটিতে নিঃসন্দেহে নিম্নলিখিতগুলি করতে পারে:

  1. একটি অস্থায়ী সরাসরি ByteBuffer বস্তু তৈরি করুন।
  2. অদক্ষ বাফারের অদক্ষ বাফারের সামগ্রী অনুলিপি করুন।
  3. অস্থায়ী বাফার ব্যবহার করে নিম্ন স্তরের I / O ক্রিয়াকলাপটি সম্পাদন করুন।
  4. অস্থায়ী বাফার বস্তু সুযোগ আউট যায় এবং অবশেষে সংগ্রহস্থল আবৃত হয়।

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

ডাইরেক্ট বাফারগুলি I / O এর জন্য সর্বোত্তম, তবে তারা নোডোয়াইট বাইট বাফারের চেয়ে আরও ব্যয়বহুল হতে পারে। সরাসরি বাফার দ্বারা ব্যবহৃত মেমরিটি স্ট্যান্ডার্ড JVM হিপ বাইপাস করে নেটিভ, অপারেটিং সিস্টেম-নির্দিষ্ট কোডের মাধ্যমে কল করে বরাদ্দ করা হয়। হোস্ট অপারেটিং সিস্টেম এবং JVM বাস্তবায়নের উপর নির্ভর করে সরাসরি বাফারগুলি সেট আপ করা এবং হিপ-রেসিডেন্ট বাফারগুলির চেয়ে উল্লেখযোগ্যভাবে আরো ব্যয়বহুল হতে পারে। সরাসরি বাফারের মেমরি-স্টোরেজ এলাকায় আবর্জনা সংগ্রহের বিষয় নয় কারণ এটি মানক JVM হিপের বাইরে।

সরাসরি বনাম nondirect বাফার ব্যবহার করার কার্যকারিতা tradeoff ব্যাপকভাবে JVM, অপারেটিং সিস্টেম, এবং কোড নকশা দ্বারা পরিবর্তিত হতে পারে। হিপ বাইরে মেমরি বরাদ্দ করে, আপনি অতিরিক্ত অ্যাপ্লিকেশন আপনার অ্যাপ্লিকেশন বিষয় হতে পারে যা JVM অজ্ঞাত। খেলার মধ্যে অতিরিক্ত চলন্ত অংশ আনয়ন যখন, আপনি পছন্দসই প্রভাব অর্জন করছেন তা নিশ্চিত করুন। আমি পুরানো সফ্টওয়্যার maxim সুপারিশ: প্রথম এটি কাজ, তারপর তা দ্রুত করা। সামনে অপ্টিমাইজেশান সম্পর্কে খুব চিন্তা করবেন না; সঠিকতা প্রথম মনোনিবেশ। JVM বাস্তবায়ন বাফার ক্যাশিং বা অন্যান্য অপ্টিমাইজেশানগুলি সম্পাদন করতে সক্ষম হতে পারে যা আপনাকে আপনার অংশে অপ্রয়োজনীয় প্রচেষ্টার জন্য প্রয়োজনীয় কর্মক্ষমতা সরবরাহ করবে।





bytebuffer