java জেনেটিক কোড কল করতে জেএনএ পরিবর্তে জেএনআই ব্যবহার করবেন?



জেনেটিক কোড বলতে কি বুঝায় (8)

আমি আসলে জেএনআই এবং জেএনএর সাথে কিছু সহজ মানদণ্ড করেছি।

অন্যদের ইতিমধ্যে নির্দেশিত হিসাবে, জেএনএ সুবিধার জন্য। JNA ব্যবহার করার সময় আপনাকে নেটিভ কোড কম্পাইল বা লিখতে হবে না। জেএনএর নেটিভ লাইব্রেরী লোডার আমি কখনও দেখেছি এমন সর্বোত্তম / সহজতম ব্যবহার। দুঃখজনকভাবে, আপনি JNI এর জন্য এটি ব্যবহার করতে পারেন না মনে হয়। (এই কারণে আমি System.loadLibrary () এর জন্য একটি বিকল্প লিখেছি যা JNA এর পথ কনভেনশন ব্যবহার করে এবং ক্লাসপথ (অর্থাৎ জার্স) থেকে সীমাহীন লোডিংকে সমর্থন করে।)

তবে জেএনএর কর্মক্ষমতা জেএনআইয়ের চেয়ে অনেক খারাপ হতে পারে। আমি একটি সহজ জেনেটিক পূর্ণসংখ্যা বৃদ্ধি ফাংশন "রিটার্ন আর্গ + 1;" বলে একটি খুব সহজ পরীক্ষা করেছিলাম। জেএমএইচ দিয়ে সম্পন্ন বেঞ্চমার্ক দেখিয়েছে যে জেএনআই যে ফাংশনটিতে কল করেছে তা জেএনএর চেয়ে 15 গুণ বেশি দ্রুত।

আরো একটি "জটিল" উদাহরণ যেখানে স্থানীয় ফাংশনটি 4 মানগুলির একটি পূর্ণসংখ্যা অ্যারের সমষ্টি হিসাবে দেখায় তা এখনও দেখায় যে জেএনআই কর্মক্ষমতা জেএনএর চেয়ে 3 গুণ দ্রুত। JNI এ অ্যারে অ্যাক্সেস করার জন্য আপনি কীভাবে হ্রাস পেয়েছিলেন তা হ্রাস করা সুবিধাটি: আমার উদাহরণটি কিছু উপাদান তৈরি করে এবং প্রতিটি সংস্পর্শের সময় এটি আবার প্রকাশ করে।

কোড এবং পরীক্ষা ফলাফল github পাওয়া যাবে।

JNI এর তুলনায় নেটিভ কোড কল করার জন্য JNA ব্যবহার করাটা বেশ সহজ। জেএনএর উপর কোন ক্ষেত্রে আপনি জেএনআই ব্যবহার করবেন?


Answer #1

এটা যেমন একটি জেনেরিক প্রশ্নের উত্তর দিতে কঠিন। আমি মনে করি সর্বাধিক সুস্পষ্ট পার্থক্য হল যে জেএনআইয়ের সাথে, জাভা / নেটিভ সীমান্তের স্থানীয় দিকে টাইপ রূপান্তর প্রয়োগ করা হয়, যখন জেএনএর সাথে, ধরন রূপান্তর জাভাতে প্রয়োগ করা হয়। যদি আপনি ইতিমধ্যে সি-তে প্রোগ্রামিংয়ের সাথে বেশ আরামদায়ক বোধ করেন এবং নিজেকে কিছু স্থানীয় কোড বাস্তবায়ন করতে চান তবে আমি মনে করব যে জেএনআই খুব জটিল বলে মনে হবে না। আপনি যদি জাভা প্রোগ্রামার হন এবং কেবলমাত্র তৃতীয় পক্ষের স্থানীয় লাইব্রেরীটি আহ্বান করতে হয় তবে JNA ব্যবহার করা সম্ভবত সম্ভবত সহজ নয় যা JNI এর সাথে সম্ভবত সমস্যাগুলি এড়াতে সবচেয়ে সহজ উপায়।

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


Answer #2

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


Answer #3
  1. আপনি JNA ছিল আগে কয়েক বছর আগে কোড লিখছেন বা একটি প্রাক 1.4 জেআর লক্ষ্য করা হয়।
  2. আপনি যে কোডটি দিয়ে কাজ করছেন তা একটি DLL \ SO তে নয়।
  3. আপনি এলজিপিএলের সাথে অসঙ্গতিপূর্ণ কোডে কাজ করছেন।

আমার মাথার উপরে দিয়েই আমি আসতে পারি, যদিও আমি কোনও ভারী ব্যবহারকারী নই। মনে হয় আপনি জেএনএ এড়াতে পারেন তবে আপনি যদি তাদের চেয়ে বেশি ইন্টারফেস চেয়েছিলেন তবে আপনি জাভাতে এটি কোড করতে পারেন।


Answer #4

যদি আমি কিছু অনুপস্থিত না থাকি তবে জেএনএ বনাম জেএনএ-এর মধ্যে প্রধান পার্থক্য কি না যে জেএনএর সাথে আপনি জাভা কোডটি স্থানীয় (সি) কোড থেকে কল করতে পারবেন না?


Answer #5

আমি জেএনআই এবং জেএনএকে পারফরম্যান্স তুলনা করার জন্য তদন্ত করেছি কারণ আমাদের প্রকল্পে একটি ডিল আহ্বান করার জন্য আমাদের একটি সিদ্ধান্ত নিতে হয়েছিল এবং আমাদের কাছে প্রকৃত সময় সীমাবদ্ধতা ছিল। ফলাফলগুলি দেখিয়েছে যে জেএনআই-এর জিনো (প্রায় 40 গুণ) এর চেয়েও বেশি কর্মক্ষমতা রয়েছে। সম্ভবত জেএনএতে ভাল পারফরম্যান্সের জন্য একটি কৌশল রয়েছে কিন্তু এটি একটি সহজ উদাহরণের জন্য খুব ধীর।


Answer #6

আপনি যদি জেএনআই কর্মক্ষমতা চান তবে জটিলতার কারণে এটি হতাশ হয়ে পড়ে তবে আপনি স্বয়ংক্রিয়ভাবে জেএনআই বাইন্ডিংগুলি জেনারেট করে এমন সরঞ্জামগুলির ব্যবহার বিবেচনা করতে পারেন। উদাহরণস্বরূপ, JANET (দাবিত্যাগ: আমি এটি লিখেছি) আপনাকে একটি একক উৎস ফাইলের মধ্যে জাভা এবং সি ++ কোড JANET অনুমতি দেয়, এবং উদাহরণস্বরূপ স্ট্যান্ডার্ড জাভা সিনট্যাক্স ব্যবহার করে সি ++ থেকে জাভাগুলিতে কল করুন। উদাহরণস্বরূপ, এখানে আপনি জাভা স্ট্যান্ডার্ড আউটপুটের জন্য একটি সি স্ট্রিং কিভাবে মুদ্রণ করবেন:

native "C++" void printHello() {
    const char* helloWorld = "Hello, World!";
    `System.out.println(#$(helloWorld));`
}

জেনেট তারপর ব্যাকটি-এমবেডেড জাভাটিকে উপযুক্ত JNI কলগুলিতে অনুবাদ করে।


Answer #7

এটি সরাসরি উত্তর নয় এবং আমি জেএনএর সাথে কোন অভিজ্ঞতা নেই তবে, যখন আমি জেএনএ ব্যবহার করে প্রকল্পগুলি দেখি এবং SVNKit, IntelliJ IDEA, NetBeans IDE ইত্যাদি নামগুলি দেখি, তখন আমি বিশ্বাস করি এটি একটি সুন্দর সুন্দর লাইব্রেরি।

প্রকৃতপক্ষে, আমি স্পষ্টভাবে মনে করি আমি জেএনআইয়ের পরিবর্তে জেএনএ ব্যবহার করতাম, যখন এটি আসলেই জেএনআই (যা একটি বিরক্তিকর উন্নয়ন প্রক্রিয়া আছে) তুলনায় সহজতর ছিল। খুব খারাপ, এই সময়ে জেএনএ মুক্তি পায় নি।





jna