জাভাতে কি ইনলাইন ফাংশন রয়েছে?


112

জাভাতে ইনলাইন ফাংশনগুলির ধারণা আছে, বা এর পরিবর্তিত অন্য কিছু? যদি থাকে তবে এটি কীভাবে ব্যবহৃত হয়? আমি শুনেছি public, staticএবং finalপদ্ধতিগুলি হল ইনলাইন ফাংশন। আমরা কি আমাদের নিজস্ব ইনলাইন ফাংশন তৈরি করতে পারি?


4
শুধু স্পষ্ট করার জন্য, আপনার মানে en.wikedia.org/wiki/Inline_function , en.wikedia.org/wiki/Anonymous_function না, তাই না ?
জেডাব্লু

3
একটি সামান্য মন্তব্য হিসাবে, অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল। সর্বজনীন, স্থির এবং চূড়ান্ত প্রকৃতি পুরোপুরি না বুঝে আপনি সত্যিকার অর্থে ইনলাইনিংয়ের প্রভাবটি বুঝতে পারবেন না - এবং এটি আপনি যে জেভিএম ব্যবহার করছেন তার উপর নির্ভরশীল। আপনার কেন কিছু ইনলাইন করা দরকার তা প্রথমে উত্তর দেওয়ার বিষয়ে নিশ্চিত হন: উচ্চতর আরওআই অপ্টিমাইজেশন আপনি অন্য কোথাও করতে পারবেন এটি প্রায় নিশ্চিত।
নাথানিয়েল ফোর্ড

1
আরো দেখুন stackoverflow.com/q/7772864/632951
Pacerier

উত্তর:


123

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

জাভা সংকলকরা কখনই কোনও মেথড কলকে ইনলাইন করে না (জেভিএম রানটাইমের সময় যা কিছু করে)। তারা ইনলাইন সংকলনের সময় ধ্রুবকগুলি করে (যেমন চূড়ান্ত স্ট্যাটিক আদিম মান)। তবে পদ্ধতি নয়।

আরও সংস্থান জন্য:

  1. নিবন্ধ: জাভা হটস্পট পারফরম্যান্স ইঞ্জিন: পদ্ধতি ইনলাইনিং উদাহরণ

  2. উইকি: ওপেনজেডিকে ইনলাইনিং , সম্পূর্ণ জনবহুল নয় তবে দরকারী আলোচনার লিঙ্কগুলি রয়েছে।


15

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

সাধারণত কোড বিভাগগুলির জন্য প্রায়শই ব্যবহৃত জেভিএম / জেআইটি / হটস্পটের সাথে সংমিশ্রণে এই জাতীয় কোড অপটিমাইজেশনগুলি সংকলক দ্বারা সম্পন্ন হয়। এছাড়াও অন্যান্য অপ্টিমাইজেশন ধারণা যেমন প্যারামিটারগুলির রেজিস্ট্রার ঘোষণার বিষয়টি জাভাতে জানা যায় না।

জাভাতে ঘোষণার মাধ্যমে অপ্টিমাইজেশানগুলি বাধ্য করা যায় না, তবে সংকলক এবং জেআইটি দ্বারা করা হয়। অন্যান্য অনেক ভাষায় এই ঘোষণাগুলি প্রায়শই কেবল সংকলক সংকেত হয় (প্রসেসরের চেয়ে আপনি আরও নিবন্ধকারের প্যারামিটারগুলি ঘোষণা করতে পারেন, বাকিটি উপেক্ষা করা হবে)।

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


3
finalজেআইটি ইনলাইনিংয়ে কোনও প্রভাব ফেলবেন না
স্টিভ কুও

1
+1, তবে আমরা কীভাবে কোনও পদ্ধতির সংকলিত সংস্করণটি অন্তর্নিহিত কিনা তা পরীক্ষা করতে পারি ?
পেসারিয়ার

@ পেসারিয়ার তবে কিছু পরীক্ষা করা উচিত কিনা তা কেন আমাদের পরীক্ষা করা উচিত?
আর্নে বার্মিস্টার

14

জাভা ম্যানুয়ালি কোনও পদ্ধতির অন্তর্ভুক্ত হওয়া উচিত এমন পরামর্শ দেওয়ার কোনও উপায় সরবরাহ করে না। @ নননুপ মন্তব্যে যেমন বলেছেন, সন্নিবেশ সাধারণত কার্যকরভাবে কার্যকর করার সময় জেভিএম দ্বারা করা হয়।


3
বেশিরভাগ জাভা সংকলকরা কখনই ইনলাইন পদ্ধতি পদ্ধতি কল করে না। বেশিরভাগই জেভিএম তা করে।
notnoop

এটা স্পষ্ট করার জন্য ধন্যবাদ। ঠিক কোন পর্যায়ে এসেছিল তা আমি নিশ্চিত ছিলাম না। আমি প্রতিবিম্বিত করতে আমার পোস্ট সম্পাদনা করব।
টমাস

@ থমাস ওভেনস এটি করে তবে এটি সর্বজনীন নয়jdk.internal.vm.annotation.ForceInline
ইউজিন

4

আপনি উপরে যা বলেছেন তা সঠিক। কখনও কখনও চূড়ান্ত পদ্ধতিগুলি ইনলাইন হিসাবে তৈরি করা হয় তবে জাভাতে স্পষ্টভাবে একটি ইনলাইন ফাংশন তৈরির উপায় নেই।


5
চূড়ান্ত পদ্ধতিগুলি ইনলাইন হওয়ার গ্যারান্টিযুক্ত নয়।
টমাস

4
হটস্পট-এ, finalপদ্ধতিটি অন্তর্নিহিত কিনা তা নিয়ে যোগ করার পরেও কোনও পার্থক্য নেই।
টম হাটিন -


@ টমহাউটিন-ট্যাকলাইন আপনার পক্ষে কোনও অনুমোদিত উত্স আছে? যতদূর আমি জানি, চূড়ান্ত পদ্ধতিগুলি কোনও প্রকার গার্ডকে নিয়োগ না করেই ইনলাইন করা যেতে পারে, যার অর্থ হল যে সংশোধকটি ইনডিটিং পদ্ধতিটিকে মডিফায়ার ছাড়াই বেশি দক্ষ করে তোলে। আমি জানি যে ইনলাইন করা হবে কিনা তা সিদ্ধান্ত নেওয়ার সময় জিক্স আরভিএম এটিকে বিবেচনা করে। আপনি কি নিশ্চিত যে হটস্পট কিছু চেনাজানা কিছু করে না?
জান্নিক জোহেম

2

বাস্তব জীবনের উদাহরণ:

public class Control {
    public static final long EXPIRED_ON = 1386082988202l;
    public static final boolean isExpired() {
        return (System.currentTimeMillis() > EXPIRED_ON);
    }
}

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

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

আমার গবেষণা থেকে, এটি করা যাবে না। সম্ভবত কিছু Obfuscator সরঞ্জাম এটি করতে পারে, বা, সংকলনের আগে আপনি উত্সগুলি সম্পাদনা করতে আপনার বিল্ড প্রক্রিয়াটি পরিবর্তন করতে পারেন।

কন্ট্রোল করার সময় নিয়ন্ত্রণ শ্রেণি থেকে পদ্ধতিটি অন্য শ্রেণিতে ইনলাইন স্থাপন করা হয়েছে কিনা তা প্রমাণ করার জন্য, শ্রেণিপথের নিয়ন্ত্রণ শ্রেণি ছাড়াই অন্য শ্রেণিটি চালনার চেষ্টা করুন।


2

ঠিক আছে, জাভাতে "ইনলাইন" পদ্ধতিগুলি বলা যেতে পারে তবে জাভির উপর নির্ভর করে এমন পদ্ধতি রয়েছে। সংকলনের পরে, যদি পদ্ধতির মেশিন কোডটি 35 বাইটের চেয়ে কম হয়, তবে এখনই এটি একটি ইনলাইন পদ্ধতিতে স্থানান্তরিত হবে, যদি পদ্ধতিটির মেশিন কোডটি 325 বাইটের চেয়ে কম হয়, তবে এটি jvm এর উপর নির্ভর করে কোনও ইনলাইন পদ্ধতিতে স্থানান্তরিত হতে পারে।


1
এগুলি ওরাকল এর ভিএম এর জন্য ডিফল্ট মান, ডকস.অরাকল.com
javase/

0

সুতরাং, এটি মনে হয় না, তবে আপনি পেয়ারা বা সমতুল্য ফাংশন শ্রেণির প্রয়োগের সাহায্যে এই ব্যবহারটি ব্যবহার করতে পারেন, কারণ এই শ্রেণিটি অত্যন্ত সহজ, প্রাক্তন:

    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 এর মধ্যে) কীভাবে তৈরি করা যায় এটির উদাহরণ দেওয়ার জন্য এই মৃত কোড, এটির জন্য কোনও পদ্ধতি তৈরি করতে আমাদের বিরক্ত করা উচিত নয়, একে একে ইনলাইন!


একটি যুক্তিসঙ্গত ধারণা মত মনে হচ্ছে। আপনার কি এমন কোনও সংস্করণ রয়েছে যা গুগল সাধারণ লাইব্রেরি ব্যবহার করে না?
ragerdl

0

জাভা 9 এর একটি "এগিয়ে সময়" সংকলক রয়েছে যা রানটাইমের পরিবর্তে সংকলন সময়ে বেশ কয়েকটি অপ্টিমাইজেশন করে, যা ইনলাইনিং হিসাবে দেখা যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.