জেএনআই কলকে ধীর করে দেয় কী?


194

আমি জানি যে জাভাতে জেএনআই কল করার সময় 'সীমানা পেরোন' ধীর হয়ে যায়।

তবে আমি জানতে চাই এটি কী এটি এটি ধীর করে তোলে? একটি জেএনআই কল করার সময় অন্তর্নিহিত জেভিএম বাস্তবায়ন কী করে যা এটি এত ধীর করে দেয়?


2
(+1) দুর্দান্ত প্রশ্ন। আমরা যখন বিষয়টিতে রয়েছি, আমি যারা প্রকৃত মানদণ্ড করেছেন তাদের অনুসন্ধানগুলি পোস্ট করতে উত্সাহিত করতে চাই।
এনপিই

2
একটি জেএনআই কলকে জাভা অবজেক্টগুলিকে পাস করা কিছু সিতে রূপান্তর করতে হবে (উদাহরণস্বরূপ) বুঝতে পারে; রিটার্ন মান সঙ্গে একই। টাইপ রূপান্তর এবং কল স্ট্যাক মার্শেলিং এর একটি ভাল অংশ।
ডেভ নিউটন

ডেভ, আমি এর আগে বুঝতে এবং শুনেছি। তবে রূপান্তরটি ঠিক কেমন? এটা 'কিছু' কি? আমি বিশদ খুঁজছি
pdeva

জাভা এবং সি এর মধ্যে ডেটা পাস করার জন্য ডাইরেক্ট বাইটবফার ব্যবহার করার ফলে তুলনামূলকভাবে কম ওভারহেড হতে পারে।
পিটার লরে

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

উত্তর:


174

প্রথমত, এটি লক্ষণীয় যে "ধীর" দ্বারা আমরা এমন এমন কিছু বিষয়ে কথা বলছি যা দশক ন্যানোসেকেন্ড নিতে পারে। তুচ্ছ নেটিভ পদ্ধতিতে, ২০১০ সালে আমি আমার উইন্ডোজ ডেস্কটপে গড়ে ৪০ এনএস এবং ম্যাক ডেস্কটপে ১১ এনএস কল করেছিলাম। আপনি যদি অনেকগুলি কল না করেন তবে আপনি লক্ষ্য করবেন না।

এটি বলেছিল যে কোনও জাভা পদ্ধতিতে কল করার চেয়ে নেটিভ পদ্ধতিতে কল করা ধীর হতে পারে । কারণগুলির মধ্যে রয়েছে:

  • নেটিভ পদ্ধতিগুলি জেভিএম দ্বারা সন্নিবেশিত হবে না। বা এই নির্দিষ্ট মেশিনের জন্য তারা কেবল ইন-টাইম সংকলিত হবে না - তারা ইতিমধ্যে সংকলিত হয়েছে।
  • একটি জাভা অ্যারে নেটিভ কোডে অ্যাক্সেসের জন্য অনুলিপি করা যেতে পারে এবং পরে আবার অনুলিপি করা যেতে পারে। অ্যারের আকারে ব্যয়টি লিনিয়ার হতে পারে। আমি জেএনআই আমার উইন্ডোজ ডেস্কটপে প্রায় 75,000 মাইক্রোসেকেন্ড এবং ম্যাকের উপরে 82 মাইক্রোসেকেন্ডগুলিতে 100,000 অ্যারের অনুলিপিটি পরিমাপ করেছি । ভাগ্যক্রমে, গেটপ্রিমিটিভআরাইক্রিটিকাল বা নিউডাইরেক্টবাইটবফারের মাধ্যমে সরাসরি অ্যাক্সেস পাওয়া যেতে পারে ।
  • যদি পদ্ধতিটি কোনও বস্তুটি পাস হয়ে যায়, বা কোনও কলব্যাক করা প্রয়োজন হয়, তবে নেটিভ পদ্ধতিটি সম্ভবত জেভিএমকে নিজস্ব কল করবে। নেটিভ কোড থেকে জাভা ক্ষেত্র, পদ্ধতি এবং প্রকারগুলি অ্যাক্সেস করতে প্রতিবিম্বের অনুরূপ কিছু দরকার। স্বাক্ষরগুলি স্ট্রিংগুলিতে নির্দিষ্ট করা হয় এবং জেভিএম থেকে জিজ্ঞাসা করা হয়। এটি ধীর এবং ত্রুটি-প্রবণ উভয়ই ।
  • জাভা স্ট্রিংগুলি অবজেক্টস, দৈর্ঘ্য এবং এনকোডযুক্ত। স্ট্রিং অ্যাক্সেস বা তৈরি করতে একটি ও (ক) অনুলিপি লাগতে পারে।

স্টিভ উইলসন এবং জেফ ক্যাসেলম্যান দ্বারা "জাভা প্ল্যাটফর্ম পারফরম্যান্স: কৌশল এবং কৌশল", 2000-এ "9.2: জেএনআইয়ের ব্যয় পরীক্ষা করা" বিভাগে কিছু অতিরিক্ত আলোচনার সম্ভাব্য তারিখ পাওয়া গেছে ¿ এটা নিচে পথ এক তৃতীয়াংশ সম্পর্কে এই পৃষ্ঠার নীচের @Philip দ্বারা মন্তব্যে দেওয়া।

২০০৯ এর আইবিএম বিকাশকারী ওয়ার্কস পেপার "জাভা নেটিভ ইন্টারফেস ব্যবহারের সেরা অভ্যাস" জেএনআইয়ের সাথে পারফরম্যান্সের ক্ষতিগুলি এড়াতে কিছু পরামর্শ সরবরাহ করে provides


1
এই উত্তরের দাবি, কিছু নেটিভ কোড JVM দ্বারা অন্তর্ভুক্ত করা যেতে পারে।
এএইচ

5
এই উত্তরে উল্লেখ করা হয়েছে যে কিছু মানক নেটিভ কোড জেএনআই ব্যবহার করার পরিবর্তে জেভিএম-এ অন্তর্ভুক্ত। উপরে, "নেটিভ পদ্ধতিগুলি" জেএনআইয়ের মাধ্যমে প্রয়োগকৃত ব্যবহারকারী-সংজ্ঞায়িত স্থানীয় পদ্ধতিগুলির সাধারণ ক্ষেত্রে বোঝায়। Sun.misc.Unsafe এর পয়েন্টারটির জন্য ধন্যবাদ।
অ্যান্ডি টমাস

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

3
@ এএইচ, আপনি ভুল অভ্যন্তরীণ ডাব্লু / জেএনআই। এগুলি বেশ আলাদা। sun.misc.Unsafeএবং অন্যান্য অনেকগুলি জিনিস যেমন System.currentTimeMillis/nanoTimeজেভিএম দ্বারা 'যাদু' এর মাধ্যমে পরিচালিত হয়। এগুলি জেএনআই নয় এবং এগুলির যথাযথ .c / .h ফাইলগুলি নেই, নিজেই JVM ইমপ্লিকে বাধা দেয়। আপনি JVM কে লিখছেন / হ্যাক না করে পন্থা অনুসরণ করা যাবে না।
বেটসেস

1
" এই java.sun.com ডকুমেন্ট " বর্তমানে ভাঙ্গা - এখানে একটি কাজের লিঙ্ক।
ফিলিপ গিন

25

এটি উল্লেখযোগ্য যে সমস্ত জাভা পদ্ধতিগুলি চিহ্নিত native"ধীর" নয়। এর মধ্যে কয়েকটি হ'ল আন্তঃব্যবস্থা যা এগুলি অত্যন্ত দ্রুত করে তোলে। কোনটি স্বতন্ত্র এবং কোনটি নয় তা পরীক্ষা করার জন্য আপনি vmSymbols.hppdo_intrinsic এ সন্ধান করতে পারেন ।


23

মূলত JVM প্রতিটি JNI কলের জন্য ব্যাখ্যামূলকভাবে সি প্যারামিটারগুলি তৈরি করে এবং কোডটি অনুকূলিত হয় না।

এই গবেষণাপত্রে আরও অনেক বিশদ বর্ণিত হয়েছে

আপনি যদি জেএনআই বনাম স্থানীয় কোড বেঞ্চমার্কিং করতে আগ্রহী হন তবে এই প্রকল্পের বেনমার্কগুলি চালনার জন্য কোড রয়েছে।


2
আপনি যে কাগজটির সাথে লিঙ্ক করেছেন সেটিকে জেএনআই অভ্যন্তরীণভাবে কীভাবে কাজ করে তা বর্ণনা করে এমন একের চেয়ে পারফরম্যান্স বেঞ্চমার্ক কাগজের মতো বলে মনে হয়।
pdeva

@ পেদেভা দুর্ভাগ্যক্রমে আমি যে অন্যান্য সংস্থানগুলি পেয়েছি সেগুলি java.sun.com এর সাথে যুক্ত ছিল এবং লিঙ্কগুলি ওরাকল অধিগ্রহণের পরে আপডেট করা হয়নি। আমি জেএনআই ইন্টারনাল সম্পর্কিত আরও বিশদ খুঁজছি।
dmck

13
কাগজটি জাভা 1.3 সম্পর্কে - বেশ অনেক দিন আগে। সেই সময়ের সমস্যাগুলি কি এখনও জাভা 7-এ প্রয়োগ হয়?
এএইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.