জাভাতে ইনলাইন ফাংশনগুলির ধারণা আছে, বা এর পরিবর্তিত অন্য কিছু? যদি থাকে তবে এটি কীভাবে ব্যবহৃত হয়? আমি শুনেছি public
, static
এবং final
পদ্ধতিগুলি হল ইনলাইন ফাংশন। আমরা কি আমাদের নিজস্ব ইনলাইন ফাংশন তৈরি করতে পারি?
জাভাতে ইনলাইন ফাংশনগুলির ধারণা আছে, বা এর পরিবর্তিত অন্য কিছু? যদি থাকে তবে এটি কীভাবে ব্যবহৃত হয়? আমি শুনেছি public
, static
এবং final
পদ্ধতিগুলি হল ইনলাইন ফাংশন। আমরা কি আমাদের নিজস্ব ইনলাইন ফাংশন তৈরি করতে পারি?
উত্তর:
জাভাতে, অপটিমাইজেশনগুলি সাধারণত জেভিএম স্তরে করা হয়। রানটাইমের সময়, কোন পদ্ধতিগুলিকে ইনলাইন করতে হবে তা নির্ধারণ করতে জেভিএম কিছু "জটিল" বিশ্লেষণ করে। এটি ইনলাইনিংয়ে আক্রমণাত্মক হতে পারে এবং হটস্পট জেভিএম আসলে চূড়ান্তভাবে চূড়ান্ত নয় এমন পদ্ধতিগুলি ইনলাইন করতে পারে।
জাভা সংকলকরা কখনই কোনও মেথড কলকে ইনলাইন করে না (জেভিএম রানটাইমের সময় যা কিছু করে)। তারা ইনলাইন সংকলনের সময় ধ্রুবকগুলি করে (যেমন চূড়ান্ত স্ট্যাটিক আদিম মান)। তবে পদ্ধতি নয়।
আরও সংস্থান জন্য:
নিবন্ধ: জাভা হটস্পট পারফরম্যান্স ইঞ্জিন: পদ্ধতি ইনলাইনিং উদাহরণ
উইকি: ওপেনজেডিকে ইনলাইনিং , সম্পূর্ণ জনবহুল নয় তবে দরকারী আলোচনার লিঙ্কগুলি রয়েছে।
না, জাভাতে কোনও ইনলাইন ফাংশন নেই । হ্যাঁ, আপনি যখন পাবলিক ক্লাসে রেখেছেন তখন কোডের যে কোনও জায়গায় আপনি সর্বজনীন স্ট্যাটিক পদ্ধতি ব্যবহার করতে পারেন। জাভা সংকলক ইনলাইন প্রসারণ করতে পারে একটি স্ট্যাটিক বা চূড়ান্ত পদ্ধতিতে , তবে এটির নিশ্চয়তা নেই।
সাধারণত কোড বিভাগগুলির জন্য প্রায়শই ব্যবহৃত জেভিএম / জেআইটি / হটস্পটের সাথে সংমিশ্রণে এই জাতীয় কোড অপটিমাইজেশনগুলি সংকলক দ্বারা সম্পন্ন হয়। এছাড়াও অন্যান্য অপ্টিমাইজেশন ধারণা যেমন প্যারামিটারগুলির রেজিস্ট্রার ঘোষণার বিষয়টি জাভাতে জানা যায় না।
জাভাতে ঘোষণার মাধ্যমে অপ্টিমাইজেশানগুলি বাধ্য করা যায় না, তবে সংকলক এবং জেআইটি দ্বারা করা হয়। অন্যান্য অনেক ভাষায় এই ঘোষণাগুলি প্রায়শই কেবল সংকলক সংকেত হয় (প্রসেসরের চেয়ে আপনি আরও নিবন্ধকারের প্যারামিটারগুলি ঘোষণা করতে পারেন, বাকিটি উপেক্ষা করা হবে)।
জাভা পদ্ধতিগুলি স্থির, চূড়ান্ত বা ব্যক্তিগত হিসাবে ঘোষনা করাও সংকলকের জন্য ইঙ্গিত। আপনার এটি ব্যবহার করা উচিত, তবে কোনও গ্যারান্টি নেই। জাভা পারফরম্যান্স গতিশীল, স্থির নয়। শ্রেণিতে লোড হওয়ার কারণে কোনও সিস্টেমে প্রথম কল সবসময় ধীর হয়। পরবর্তী কলগুলি দ্রুত হয়, তবে মেমরি এবং রানটাইমের উপর নির্ভর করে সর্বাধিক প্রচলিত কলগুলি চলমান সিস্টেমের সাহায্যে অনুকূলিত হয়, সুতরাং কোনও সার্ভার রানটাইমের সময় দ্রুততর হয়ে উঠতে পারে!
final
জেআইটি ইনলাইনিংয়ে কোনও প্রভাব ফেলবেন না
জাভা ম্যানুয়ালি কোনও পদ্ধতির অন্তর্ভুক্ত হওয়া উচিত এমন পরামর্শ দেওয়ার কোনও উপায় সরবরাহ করে না। @ নননুপ মন্তব্যে যেমন বলেছেন, সন্নিবেশ সাধারণত কার্যকরভাবে কার্যকর করার সময় জেভিএম দ্বারা করা হয়।
jdk.internal.vm.annotation.ForceInline
আপনি উপরে যা বলেছেন তা সঠিক। কখনও কখনও চূড়ান্ত পদ্ধতিগুলি ইনলাইন হিসাবে তৈরি করা হয় তবে জাভাতে স্পষ্টভাবে একটি ইনলাইন ফাংশন তৈরির উপায় নেই।
final
পদ্ধতিটি অন্তর্নিহিত কিনা তা নিয়ে যোগ করার পরেও কোনও পার্থক্য নেই।
বাস্তব জীবনের উদাহরণ:
public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}
তারপরে অন্যান্য ক্লাসে, কোডটির মেয়াদ শেষ হয়ে গেলে আমি প্রস্থান করতে পারি। যদি আমি অন্য শ্রেণীর থেকে এক্সপ্রেডিটোথ ভেরিয়েবলটি উল্লেখ করি তবে ধ্রুবকটি বাইট কোডের সাথে ইনলাইন থাকে, যা কোডের সমস্ত স্থান যা শেষ হওয়ার তারিখটি পরীক্ষা করে তা ট্র্যাক করে রাখা খুব শক্ত করে তোলে। তবে, অন্য শ্রেণিগুলি যদি এই এক্সপায়ার্ড () পদ্ধতিটি আহ্বান করে তবে প্রকৃত পদ্ধতিটি বলা হয়, যার অর্থ হ্যাকার এই এক্সপায়ার্ড পদ্ধতিটিকে অন্য একটি দিয়ে প্রতিস্থাপন করতে পারে যা সর্বদা মিথ্যা প্রত্যাবর্তন করে।
আমি সম্মত হলাম যে কোনও সংকলককে স্থিতিশীল চূড়ান্ত পদ্ধতিটি যে সমস্ত শ্রেণীর সাথে এটি উল্লেখ করা হয়েছে তাতে ইনলাইন করতে বাধ্য করা খুব সুন্দর হবে। সেক্ষেত্রে আপনার এমনকি কন্ট্রোল ক্লাসও অন্তর্ভুক্ত করা উচিত নয়, কারণ রানটাইমের সময় এটির প্রয়োজন হবে না।
আমার গবেষণা থেকে, এটি করা যাবে না। সম্ভবত কিছু Obfuscator সরঞ্জাম এটি করতে পারে, বা, সংকলনের আগে আপনি উত্সগুলি সম্পাদনা করতে আপনার বিল্ড প্রক্রিয়াটি পরিবর্তন করতে পারেন।
কন্ট্রোল করার সময় নিয়ন্ত্রণ শ্রেণি থেকে পদ্ধতিটি অন্য শ্রেণিতে ইনলাইন স্থাপন করা হয়েছে কিনা তা প্রমাণ করার জন্য, শ্রেণিপথের নিয়ন্ত্রণ শ্রেণি ছাড়াই অন্য শ্রেণিটি চালনার চেষ্টা করুন।
ঠিক আছে, জাভাতে "ইনলাইন" পদ্ধতিগুলি বলা যেতে পারে তবে জাভির উপর নির্ভর করে এমন পদ্ধতি রয়েছে। সংকলনের পরে, যদি পদ্ধতির মেশিন কোডটি 35 বাইটের চেয়ে কম হয়, তবে এখনই এটি একটি ইনলাইন পদ্ধতিতে স্থানান্তরিত হবে, যদি পদ্ধতিটির মেশিন কোডটি 325 বাইটের চেয়ে কম হয়, তবে এটি jvm এর উপর নির্ভর করে কোনও ইনলাইন পদ্ধতিতে স্থানান্তরিত হতে পারে।
সুতরাং, এটি মনে হয় না, তবে আপনি পেয়ারা বা সমতুল্য ফাংশন শ্রেণির প্রয়োগের সাহায্যে এই ব্যবহারটি ব্যবহার করতে পারেন, কারণ এই শ্রেণিটি অত্যন্ত সহজ, প্রাক্তন:
assert false : new com.google.common.base.Function<Void,String>(){
@Override public String apply(Void input) {
//your complex code go here
return "weird message";
}}.apply(null);
হ্যাঁ, একটি জটিল কোড ব্লক ({within এর মধ্যে) কীভাবে তৈরি করা যায় এটির উদাহরণ দেওয়ার জন্য এই মৃত কোড, এটির জন্য কোনও পদ্ধতি তৈরি করতে আমাদের বিরক্ত করা উচিত নয়, একে একে ইনলাইন!