জেএনএর তুলনায় নেটিভ কোডটি কল করা মোটামুটি সহজ বলে মনে হচ্ছে জেএনএ। কোন ক্ষেত্রে আপনি জেএনএর উপরে জেএনআই ব্যবহার করবেন?
জেএনএর তুলনায় নেটিভ কোডটি কল করা মোটামুটি সহজ বলে মনে হচ্ছে জেএনএ। কোন ক্ষেত্রে আপনি জেএনএর উপরে জেএনআই ব্যবহার করবেন?
উত্তর:
এগুলিই আমি सामना করেছি। সম্ভবত আরও আছে। তবে সাধারণ পারফরম্যান্সে জেনা এবং জিন্নির মধ্যে এতটা আলাদা নয়, তাই আপনি যেখানেই জেএনএ ব্যবহার করতে পারেন, এটি ব্যবহার করুন।
সম্পাদনা
এই উত্তরটি বেশ জনপ্রিয় বলে মনে হচ্ছে। সুতরাং এখানে কিছু সংযোজন রয়েছে:
সুতরাং, আমি এখনও বিশ্বাস করি যে যেখানেই সম্ভব, জেএনএ বা ব্রিডজে ব্যবহার করা আরও ভাল, এবং যদি পারফরম্যান্স সমালোচিত হয় তবে জনিতে ফিরে আসুন, কারণ আপনাকে যদি ঘন ঘন নেটিভ ফাংশনগুলি কল করতে হয় তবে পারফরম্যান্স হিট লক্ষণীয়।
JNIEXPORT
ফাংশনগুলি কল করতে পারে। আমি বর্তমানে জাভাসিপিকে একটি বিকল্প হিসাবে অন্বেষণ করছি, যা জেএনআই ব্যবহার করে, তবে আমার মনে হয় ভ্যানিলা জেএনআই এটি সমর্থন করে না। ভ্যানিলা জেএনআই ব্যবহার করে যে আমি উপেক্ষা করছি সে ব্যবহার করে কি সি ++ সদস্য ফাংশনগুলি কল করার কোনও উপায় আছে?
এত সাধারণ প্রশ্নের উত্তর দেওয়া মুশকিল। আমি মনে করি সর্বাধিক সুস্পষ্ট পার্থক্য হ'ল জেএনআই এর সাথে টাইপ রূপান্তরটি জাভা / নেটিভ সীমান্তের নেটিভ দিকে প্রয়োগ করা হয়, আর জেএনএর সাথে জাভাতে টাইপ রূপান্তরটি প্রয়োগ করা হয়। আপনি যদি ইতিমধ্যে সি তে প্রোগ্রামিং নিয়ে বেশ স্বাচ্ছন্দ্য বোধ করেন এবং কিছু নেটিভ কোড নিজেই প্রয়োগ করতে চান তবে আমি ধরে নেব যে জেএনআই খুব জটিল মনে হবে না। আপনি যদি জাভা প্রোগ্রামার হন এবং কেবল কোনও তৃতীয় পক্ষের নেটিভ লাইব্রেরি চালু করতে চান তবে জেএনএ ব্যবহার সম্ভবত জেএনআইয়ের সাথে সম্ভবত এতটা স্পষ্ট সমস্যা থেকে বাঁচার সবচেয়ে সহজ উপায়।
যদিও আমি কখনও কোনও মতপার্থক্য চিহ্নিত করেছি না, আমি নকশার কারণেই মনে করব, কমপক্ষে কিছু পরিস্থিতিতে জেনার সাথে এই জাতীয় রূপান্তরটি জেএনআইয়ের চেয়ে খারাপ সম্পাদন করবে। উদাহরণস্বরূপ অ্যারেগুলি পাস করার সময়, জেএনএ এগুলি প্রতিটি ফাংশন কলের শুরুতে জাভা থেকে নেটিভ এবং ফাংশন কলের শেষে ফিরে আসবে। জেএনআই-এর সাহায্যে আপনি নিজেকে নিয়ন্ত্রণ করতে পারবেন যখন অ্যারের একটি স্থানীয় "ভিউ" তৈরি হবে, সম্ভাব্যভাবে কেবল অ্যারের অংশের একটি দৃশ্য তৈরি করা হবে, বেশ কয়েকটি ফাংশন কল জুড়ে ভিউটি রাখুন এবং শেষে ভিউ প্রকাশ করুন এবং আপনি চান কিনা তা সিদ্ধান্ত নিতে পারেন পরিবর্তনগুলি রাখতে (সম্ভাব্যভাবে ডেটাটি অনুলিপি করার প্রয়োজন হয়) বা পরিবর্তনগুলি বাতিল করতে (কোনও অনুলিপি লাগবে না)। আমি জানি আপনি মেমরি ক্লাস ব্যবহার করে জেএনএর সাথে ফাংশন কল জুড়ে একটি নেটিভ অ্যারে ব্যবহার করতে পারেন, তবে এটির জন্য মেমরির অনুলিপিও প্রয়োজন হবে, যা জেএনআইয়ের সাথে অপ্রয়োজনীয় হতে পারে। পার্থক্যটি প্রাসঙ্গিক নাও হতে পারে, তবে যদি আপনার মূল লক্ষ্যটি স্থানীয় কোডে এর কিছু অংশ প্রয়োগ করে অ্যাপ্লিকেশন কর্মক্ষমতা বাড়াতে হয়, খারাপ সম্পাদনকারী সেতু প্রযুক্তি ব্যবহার করা সর্বাধিক সুস্পষ্ট পছন্দ বলে মনে হয় না।
আমার মাথার উপরের অংশটিই কেবল এটাই আসতে পারে, যদিও আমি উভয়ের ভারী ব্যবহারকারী নই। এটি দেখে মনে হচ্ছে আপনি যদি জেএনএ এড়াতে পারেন তবে আপনি যদি তাদের সরবরাহ করেন তার চেয়ে আরও ভাল ইন্টারফেস চান তবে আপনি জাভাতে এটি কোড করতে পারেন।
যাইহোক, আমাদের একটি প্রকল্পে আমরা একটি খুব ছোট জেএনআই পাদদেশ প্রিন্ট রেখেছি। আমরা আমাদের ডোমেন অবজেক্টগুলির প্রতিনিধিত্ব করার জন্য প্রোটোকল বাফার ব্যবহার করেছি এবং এইভাবে জাভা এবং সি সেতুর জন্য কেবল একটি নেটিভ ফাংশন ছিল (তখন অবশ্যই সি ফাংশনটি অন্যান্য ফাংশনগুলির একটি গোছা কল করবে)।
এটি সরাসরি উত্তর নয় এবং জেএনএর সাথে আমার কোনও অভিজ্ঞতা নেই তবে যখন আমি জেএনএ ব্যবহার করে প্রকল্পগুলি দেখি দেখি এবং এসভিএনকিট, ইন্টেলিজ আইডিইএ, নেটবিয়ান আইডিআই ইত্যাদি নামগুলি দেখি বিশ্বাস করি যে এটি একটি খুব সুন্দর লাইব্রেরি।
আসলে, আমি স্পষ্টতই মনে করি আমি জেএনআইয়ের পরিবর্তে জেএনএ ব্যবহার করতাম যখন জেএনআইয়ের তুলনায় এটি সত্যই সহজ দেখাচ্ছে (যার একটি বিরক্তিকর উন্নয়ন প্রক্রিয়া রয়েছে)। খুব খারাপ, জেএনএ এই সময়ে মুক্তি পায় নি।
আপনি যদি জেএনআই পারফরম্যান্স চান তবে এর জটিলতায় ডান্ট হন, আপনি স্বয়ংক্রিয়ভাবে জেএনআই বাইন্ডিংগুলি তৈরি করে এমন সরঞ্জামগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, জ্যানেট (অস্বীকৃতি: আমি এটি লিখেছি) আপনাকে একটি একক উত্স ফাইলে জাভা এবং সি ++ কোড মিশ্রিত করতে দেয় এবং উদাহরণস্বরূপ সি ++ থেকে জাভাতে স্ট্যান্ডার্ড জাভা সিনট্যাক্স ব্যবহার করে কল করতে পারে। উদাহরণস্বরূপ, আপনি কীভাবে জাভা স্ট্যান্ডার্ড আউটপুটে সি স্ট্রিং প্রিন্ট করবেন তা এখানে:
native "C++" void printHello() {
const char* helloWorld = "Hello, World!";
`System.out.println(#$(helloWorld));`
}
জ্যানেট তারপরে ব্যাকটিক-এম্বেড করা জাভাটিকে উপযুক্ত জেএনআই কলগুলিতে অনুবাদ করে।
আমি আসলে জেএনআই এবং জেএনএর সাথে কিছু সাধারণ বেনমার্ক করেছি।
অন্যরা ইতিমধ্যে উল্লেখ করেছে যে, জেএনএ সুবিধার জন্য। জেএনএ ব্যবহার করার সময় আপনার নেটিলি কোডটি সংকলন বা লেখার দরকার নেই। জেএনএর নেটিভ লাইব্রেরি লোডারও আমি দেখেছি এখন পর্যন্ত ব্যবহারের মধ্যে অন্যতম সেরা / সহজ iest দুঃখের বিষয়, আপনি এটি জেএনআই-এর জন্য ব্যবহার করতে পারবেন না বলে মনে হয়। (এই কারণেই আমি System.loadLibrary () এর জন্য একটি বিকল্প লিখেছি ) যা জেএনএর পাথ কনভেনশন ব্যবহার করে (অর্থাত্ জারস) থেকে লোডিং সমর্থন করে))
জেএনএর পারফরম্যান্স তবে জেএনআই-র চেয়ে অনেক খারাপ হতে পারে। আমি একটি খুব সাধারণ পরীক্ষা করেছি যেটিকে একটি সরল দেশীয় পূর্ণসংখ্যার ইনক্রিমেন্ট ফাংশন বলে "রিটার্ন আরগ +1;"। জেএমএইচ দিয়ে করা বেঞ্চমার্কগুলি দেখিয়েছে যে জেএনআই function ফাংশনটিতে কল করেছে, জেএনএর চেয়ে 15 গুণ দ্রুত।
আরও একটি "জটিল" উদাহরণ যেখানে নেটিভ ফাংশনটি 4 টি মানের পূর্ণসংখ্যার অ্যারের সমষ্টি করে তা এখনও দেখায় যে জেএনআই পারফরম্যান্স জেএনএর চেয়ে 3 গুণ বেশি গতিযুক্ত। হ্রাসযুক্ত সুবিধা সম্ভবত এটি ছিল যে আপনি কীভাবে জেএনআইতে অ্যারে অ্যাক্সেস করেছেন: আমার উদাহরণটি কিছু স্টাফ তৈরি করেছে এবং প্রতিটি সংক্ষেপণ ক্রিয়াকলাপের সময় এটি আবার মুক্তি দিয়েছে।
কোড এবং পরীক্ষার ফলাফলগুলি গিথুবে পাওয়া যাবে ।
পারফরম্যান্স তুলনার জন্য আমি জেএনআই এবং জেএনএ তদন্ত করেছি কারণ আমাদের প্রকল্পের মধ্যে একটি ডেল কল করার জন্য তাদের মধ্যে একটির সিদ্ধান্ত নেওয়ার প্রয়োজন ছিল এবং আমাদের আসল সময়সীমা ছিল। ফলাফলগুলি প্রমাণ করেছে যে জেএনআইয়ের তুলনায় জেএনএর চেয়ে বেশি পারফরম্যান্স রয়েছে (প্রায় 40 বার)। জেএনএতে আরও ভাল পারফরম্যান্সের কৌশল থাকতে পারে তবে এটি একটি সাধারণ উদাহরণের জন্য খুব ধীর।
আমি কিছু মিস করছি না, যদি না জেএনএ বনাম জেএনআইয়ের মধ্যে মূল পার্থক্য না যে জেএনএর সাথে আপনি জাভা কোডটি স্থানীয় (সি) কোড থেকে কল করতে পারবেন না?
আমার নির্দিষ্ট প্রয়োগে, জেএনআই ব্যবহার করা আরও সহজ প্রমাণিত হয়েছে। সিরিয়াল পোর্টে এবং এ থেকে আমার ধারাবাহিক স্ট্রিমগুলি পড়ার এবং লেখার দরকার ছিল - এবং অন্য কিছু নয়। জেএনএ-র মধ্যে খুব জড়িত অবকাঠামো শেখার চেষ্টা করার পরিবর্তে, আমি উইন্ডোজের একটি বিশেষ-উদ্দেশ্যে ডিএলএল দ্বারা মাত্র ছয়টি ক্রিয়াকলাপ রফতানি করে দেশীয় ইন্টারফেসের প্রোটোটাইপ করা আরও সহজ পেয়েছি: