জাভাতে উদাহরণস্বরূপ ব্যবহারের পারফরম্যান্স প্রভাব


314

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

উদাহরণস্বরূপ, আমার কাছে 10 টি সাবক্লাসের একটি বেস ক্লাস রয়েছে। বেস ক্লাস গ্রহণ করে এমন একক ফাংশনে, আমি ক্লাসটি সাবক্লাসের উদাহরণ হিসাবে পরীক্ষা করে কিছু রুটিন সম্পাদন করি কিনা তা পরীক্ষা করে দেখি।

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

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


81
আমি মনে করি যে প্রশ্নটির বিন্দুটি ছিল সেরা ওও অনুশীলনের প্রশ্নটি আলাদা করে রাখা এবং কার্য সম্পাদন পরীক্ষা করা।
ডেভ এল।

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

51
উগ ... সমস্ত উত্তর কেন প্রশ্নের বিন্দু থেকে বাদ যায় এবং অপ্টিমাইজেশান সম্পর্কে একই পুরাতন নূথ র‌্যাটারিক সরবরাহ করে? আপনার প্রশ্নটি উদাহরণস্বরূপ == সহ শ্রেণীর অবজেক্টটি পরীক্ষা করার চেয়ে উল্লেখযোগ্যভাবে / আশ্চর্যজনকভাবে ধীরে ধীরে কিনা তা সম্পর্কে এবং আমি খুঁজে পেয়েছি যে এটি নেই।
গুবি

3
উদাহরণস্বরূপ এবং castালাইয়ের পারফরম্যান্সটি বেশ ভাল। : আমি এখানে সমস্যা বিভিন্ন পন্থা প্রায় Java7 মধ্যে কিছু সময়জ্ঞান পোস্ট stackoverflow.com/questions/16320014/...
Wheezil

উত্তর:


268

আধুনিক জেভিএম / জেআইসি সংকলকগণ বেশিরভাগ theতিহ্যগতভাবে "ধীর" অপারেশনগুলির পারফরম্যান্স হিটকে মুছে ফেলেছে, উদাহরণস্বরূপ, ব্যতিক্রম হ্যান্ডলিং, প্রতিবিম্ব ইত্যাদি including

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


13
আধুনিক জেভিএম / জেআইসি .. আপনি দয়া করে কোন জাভা সংস্করণ থেকে এই অপটিমাইজেশনটি কভার করা হয়েছে তা উল্লেখ করুন?
রবিশা

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

4
এখানে একপাশে তবে কি আরও try { ObjT o = (ObjT)object } catch (e) { no not one of these }ধীর হবে ??
পিটার্ক

35
যদি "অবজেক্ট" ওবজেটি-র উদাহরণ হয়, তবে এটি তৈরি করা উদাহরণস্বরূপ করার চেয়ে কিছুটা দ্রুত, তবে আমার দ্রুত পরীক্ষাটি যে পার্থক্যটি পেয়েছে তা 10,000,000 পুনরাবৃত্তির চেয়ে 10-20 মিমি থেকে বেশি। যদি "অবজেক্ট" কোনও ওবিজেটি না হয়, তবে, ব্যতিক্রমটি ধরা 3000x এর চেয়ে ধীর - উদাহরণস্বরূপ 31,000 মিমি বনাম 10 ডলার।
স্টিভ

19
কোনও "রেফারেন্স" ছাড়াই এই জাতীয় দৃ argument় যুক্তি পুরোপুরি অকেজো কারণ কেবল মতামত দেওয়া হয়েছে।
মার্কোরোসি

278

অভিগমন

আমি বিভিন্ন বাস্তবায়ন মূল্যায়নের জন্য একটি বেঞ্চমার্ক প্রোগ্রাম লিখেছি :

  1. instanceof বাস্তবায়ন (রেফারেন্স হিসাবে)
  2. একটি বিমূর্ত শ্রেণি এবং @Overrideএকটি পরীক্ষার পদ্ধতির মাধ্যমে অবজেক্টটি ভিত্তিক ated
  3. নিজস্ব ধরণের বাস্তবায়ন ব্যবহার করে
  4. getClass() == _.class বাস্তবায়ন

আমি 100 টি ওয়ার্মআপ কল, পরিমাপের অধীনে 1000 পুনরাবৃত্তি এবং 10 টি কাঁটাচামচ দিয়ে বেঞ্চমার্ক চালাতে jmh ব্যবহার করেছি । সুতরাং প্রতিটি বিকল্প 10 000 বার পরিমাপ করা হয়েছিল, যা ম্যাকস 10.12.4 এবং জাভা 1.8 সহ আমার ম্যাকবুক প্রোতে পুরো বেনমার্কটি চালাতে 12:18:57 লাগে। মানদণ্ড প্রতিটি বিকল্পের গড় সময়কে পরিমাপ করে। আরও তথ্যের জন্য গিটহাবে আমার বাস্তবায়ন দেখুন ।

সম্পূর্ণতার জন্য: এই উত্তরটির একটি পূর্ববর্তী সংস্করণ এবং আমার মানদণ্ড রয়েছে

ফলাফল

| অপারেশন | অপারেশন প্রতি ন্যানোসেকেন্ডে রানটাইম | উদাহরণস্বরূপ |
| ------------ | ------------------------------------ - | ------------------------ |
| ইনস্ট্যান্সওফ | 39,598 ± 0,022 এনএস / অপশন | 100,00% |
| GETCLASS | 39,687 ± 0,021 এনএস / অপশন | 100,22% |
| টাইপ | 46,295 ± 0,026 ns / op | 116,91% |
| ওও | 48,078 ± 0,026 ns / op | 121,42% |

TL; ড

জাভাতে 1.8 instanceofদ্রুততম পন্থা, যদিও getClass()এটি খুব কাছে।


58
+0.(9)বিজ্ঞানের জন্য!

16
+ আমার কাছ থেকে অন্য 0.1: ডি
টোবিয়াস রিচ

14
@ তোবিয়াস রিচ তাই আমরা পেয়েছি +1.0(9)। :)
পাভেল

9
আমি এটিকে মোটেই অর্থবহ কিছু মনে করি না। System.currentTimeMillis()কোনও অপারেশন ব্যবহার করে কোড পরিমাপ করে যা একক পদ্ধতিতে কল করার চেয়ে বেশি নয়, যা নিখুঁতভাবে কম দেওয়া উচিত। পরিবর্তে জেএমএইচের মতো একটি মানদণ্ডের কাঠামো ব্যবহার করুন !
Lii

6
অথবা কেবলমাত্র প্রতিটি কলের পরিবর্তে পুরো বিলিয়ন কলগুলির টাইমিং করুন।
কিংবদন্তি লেন্থথ

74

উদাহরণস্বরূপ, পারফরম্যান্সটি কেবল একটি অক্ষরের সাথে একটি স্ট্রিং অবজেক্টে একটি সাধারণ s.equals () কলটির সাথে কীভাবে তুলনা করছে তা দেখার জন্য আমি কেবল একটি সহজ পরীক্ষা করেছি।

একটি 10.000.000 লুপে উদাহরণটি আমাকে 63৩-৯6 মিমি এবং স্ট্রিংয়ের সমান আমাকে ১০ 10-২৩০ মিমি দিয়েছে

আমি জাভা জেভিএম 6 ব্যবহার করেছি।

সুতরাং আমার সাধারণ পরীক্ষায় একটি চরিত্রের স্ট্রিং তুলনার পরিবর্তে উদাহরণস্বরূপ করা দ্রুত।

স্ট্রিংয়ের পরিবর্তে ইন্টিজারের।


4
আপনার পক্ষে কি কোডটি এখানে পোস্ট করা সম্ভব হবে? এইটা চমৎকার হবে!
দ্য কিমিস্ট

7
পলিমারফিক ফাংশন প্রেরণের সাথে উদাহরণটি কীভাবে তুলনা করে?
ক্রিস

21
আপনি স্ট্রিং.এক্কালস () এর সাথে উদাহরণের তুলনা করেন কেন? আপনি টাইপ আপনি object.getClass () করতে থাকে তাহলে চেক করতে চান, সমান (SomeType.class)।
marsbear

4
@ মার্সবার equals()এটিকে কাটবে না, কারণ সাবক্লাসিং; আপনার যা দরকার তা isAssignableFrom()
ডেভিড মোলস

1
@ মার্সবার ভাল, তবে ওপি যা চেয়েছিল তা এর চেয়ে ভাল পরীক্ষা নয়।
ডেভিড মোল

20

যে আইটেমগুলি পারফরম্যান্সের প্রভাব নির্ধারণ করবে তা হ'ল:

  1. সম্ভাব্য শ্রেণীর সংখ্যা যার জন্য উদাহরণস্বরূপ অপারেটর সত্যটি ফিরে আসতে পারে
  2. আপনার ডেটা বিতরণ - প্রথম বা দ্বিতীয় প্রয়াসে বেশিরভাগ দৃষ্টান্তই সমাধান হয়? আপনি প্রথমে সত্যিকারের ক্রিয়াকলাপ প্রত্যাবর্তনের সম্ভাবনাটি রাখতে চান।
  3. স্থাপনার পরিবেশ। সান সোলারিস ভিএম-তে চালানো সনের উইন্ডোজ জেভিএমের চেয়ে উল্লেখযোগ্যভাবে আলাদা। সোলারিস ডিফল্টরূপে 'সার্ভার' মোডে চলবে, অন্যদিকে উইন্ডোজ ক্লায়েন্ট মোডে চলবে। সোলারিসে জেআইটি অপ্টিমাইজেশন সমস্ত পদ্ধতিতে অ্যাক্সেসকে সক্ষম করে তুলবে।

আমি প্রেরণের চারটি ভিন্ন পদ্ধতির জন্য একটি মাইক্রোব্যাঙ্কমার্ক তৈরি করেছি । সোলারিসের ফলাফলগুলি নিম্নরূপে, ছোট সংখ্যা দ্রুত হওয়ায়:

InstanceOf 3156
class== 2925 
OO 3083 
Id 3067 

18

আপনার শেষ প্রশ্নের উত্তর দেওয়া: যদি না কোনও প্রোফাইলার আপনাকে না বলে যে আপনি একটি হাস্যকর সময় ব্যয় করেছেন উদাহরণস্বরূপ: হ্যাঁ, আপনি নিটপিক করছেন।

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

উচ্চতর সংযোজনকারী সংকলকগুলির ক্ষেত্রে, বাধা সম্পর্কে আপনার অনুমানগুলি সম্পূর্ণরূপে ভুল হতে পারে।

এবং এই উত্তরের সত্যে (যা আমি পুরোপুরি বিশ্বাস করি): আমি একেবারে জানি না যে উদাহরণস্বরূপ এবং == কীভাবে জিট-সংকলকটি এটির অনুকূলিতকরণের সুযোগ পেয়েছে তা সম্পর্কিত।

আমি ভুলে গেছি: প্রথম রান কখনই মাপবেন না।


1
তবে উল্লিখিত আসল পোস্টারটি এই অ্যাপ্লিকেশনটির জন্য সমালোচনামূলক ছিল, সুতরাং সেই পরিস্থিতিতে শুরুর দিকে অপ্টিমাইজ করা অযৌক্তিক নয়। অন্য কথায় আপনি GWBasic এ 3 ডি গেমটি লিখবেন না এবং তারপরে শেষে বলবেন, ঠিক আছে এটি অনুকূলকরণ শুরু করা যাক, প্রথম পদক্ষেপটি এটি সি ++ তে পোর্ট করা।
কিংবদন্তি লেন্থথ

সঠিক লাইব্রেরি যদি উপলভ্য থাকে তবে জিডব্লুবাসিক 3 ডি গেমের দুর্দান্ত শুরু হতে পারে। তবে সেই দিকটি (এটি একটি কৃত্রিম যুক্তি হিসাবে): ওপি অপ্টিমাইজেশন হিসাবে সম্পূর্ণ পুনর্লিখনের জন্য বলছে না। এটি একটি একক নির্মাণ সম্পর্কে যেখানে আমরা এমনকি প্রভাবগুলি উল্লেখযোগ্য কিনা তাও জানি না (যদিও সংকলকের বর্তমান সংস্করণে এটি করার আরও ভাল পারফরম্যান্স উপায় রয়েছে )। আমি দৃ2়ভাবে c2.com/cgi/wiki?ProfileBeforeOptimizing এবং আমার উত্তরের পিছনে দাঁড়িয়ে আছি । প্রাথমিক অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল! এটি রক্ষণাবেক্ষণকে আরও শক্ত করে তোলে - এবং রক্ষণাবেক্ষণ সেই
ওলাফ কক

15

আমি একই প্রশ্ন পেয়েছি, তবে আমার অনুরূপ ব্যবহারের ক্ষেত্রে 'পারফরম্যান্স মেট্রিকস' না পেয়ে আমি আরও কিছু নমুনা কোড করেছি। আমার হার্ডওয়্যার এবং জাভা 6 এবং 7 এ, উদাহরণস্বরূপ এবং 10MLn পুনরাবৃত্তিতে স্যুইচ করার মধ্যে পার্থক্য

for 10 child classes - instanceof: 1200ms vs switch: 470ms
for 5 child classes  - instanceof:  375ms vs switch: 204ms

সুতরাং, উদাহরণস্বরূপটি খুব ধীরে ধীরে, বিশেষত বিপুল সংখ্যক-যদি-অন্যথায় বিবৃতি দেয় তবে বাস্তব প্রয়োগের মধ্যে পার্থক্য নগণ্য হবে।

import java.util.Date;

public class InstanceOfVsEnum {

    public static int c1, c2, c3, c4, c5, c6, c7, c8, c9, cA;

    public static class Handler {
        public enum Type { Type1, Type2, Type3, Type4, Type5, Type6, Type7, Type8, Type9, TypeA }
        protected Handler(Type type) { this.type = type; }
        public final Type type;

        public static void addHandlerInstanceOf(Handler h) {
            if( h instanceof H1) { c1++; }
            else if( h instanceof H2) { c2++; }
            else if( h instanceof H3) { c3++; }
            else if( h instanceof H4) { c4++; }
            else if( h instanceof H5) { c5++; }
            else if( h instanceof H6) { c6++; }
            else if( h instanceof H7) { c7++; }
            else if( h instanceof H8) { c8++; }
            else if( h instanceof H9) { c9++; }
            else if( h instanceof HA) { cA++; }
        }

        public static void addHandlerSwitch(Handler h) {
            switch( h.type ) {
                case Type1: c1++; break;
                case Type2: c2++; break;
                case Type3: c3++; break;
                case Type4: c4++; break;
                case Type5: c5++; break;
                case Type6: c6++; break;
                case Type7: c7++; break;
                case Type8: c8++; break;
                case Type9: c9++; break;
                case TypeA: cA++; break;
            }
        }
    }

    public static class H1 extends Handler { public H1() { super(Type.Type1); } }
    public static class H2 extends Handler { public H2() { super(Type.Type2); } }
    public static class H3 extends Handler { public H3() { super(Type.Type3); } }
    public static class H4 extends Handler { public H4() { super(Type.Type4); } }
    public static class H5 extends Handler { public H5() { super(Type.Type5); } }
    public static class H6 extends Handler { public H6() { super(Type.Type6); } }
    public static class H7 extends Handler { public H7() { super(Type.Type7); } }
    public static class H8 extends Handler { public H8() { super(Type.Type8); } }
    public static class H9 extends Handler { public H9() { super(Type.Type9); } }
    public static class HA extends Handler { public HA() { super(Type.TypeA); } }

    final static int cCycles = 10000000;

    public static void main(String[] args) {
        H1 h1 = new H1();
        H2 h2 = new H2();
        H3 h3 = new H3();
        H4 h4 = new H4();
        H5 h5 = new H5();
        H6 h6 = new H6();
        H7 h7 = new H7();
        H8 h8 = new H8();
        H9 h9 = new H9();
        HA hA = new HA();

        Date dtStart = new Date();
        for( int i = 0; i < cCycles; i++ ) {
            Handler.addHandlerInstanceOf(h1);
            Handler.addHandlerInstanceOf(h2);
            Handler.addHandlerInstanceOf(h3);
            Handler.addHandlerInstanceOf(h4);
            Handler.addHandlerInstanceOf(h5);
            Handler.addHandlerInstanceOf(h6);
            Handler.addHandlerInstanceOf(h7);
            Handler.addHandlerInstanceOf(h8);
            Handler.addHandlerInstanceOf(h9);
            Handler.addHandlerInstanceOf(hA);
        }
        System.out.println("Instance of - " + (new Date().getTime() - dtStart.getTime()));

        dtStart = new Date();
        for( int i = 0; i < cCycles; i++ ) {
            Handler.addHandlerSwitch(h1);
            Handler.addHandlerSwitch(h2);
            Handler.addHandlerSwitch(h3);
            Handler.addHandlerSwitch(h4);
            Handler.addHandlerSwitch(h5);
            Handler.addHandlerSwitch(h6);
            Handler.addHandlerSwitch(h7);
            Handler.addHandlerSwitch(h8);
            Handler.addHandlerSwitch(h9);
            Handler.addHandlerSwitch(hA);
        }
        System.out.println("Switch of - " + (new Date().getTime() - dtStart.getTime()));
    }
}

কোন ফলাফল জাভা 6 এবং যা জাভা 7 ছিল? আপনি জাভা 8 এর অধীনে এটি পুনর্বিবেচনা করেছেন? এখানে আরও উল্লেখযোগ্যভাবে, আপনি উদাহরণস্বরূপ যদি একটি দৈর্ঘ্যের তুলনা করছেন তবে কী কী ক্ষেত্রে একটি বিবৃতি জরুরী to আমি মনে করি আমরা প্রত্যাশা করব কোন ইনট সুইচটি দ্রুত হালকা হবে।
Azeroth2b

1
আমি ঠিক 5 বছর আগে যা ঘটছিল তা মনে করতে পারি না - আমি মনে করি জাভা 6 এবং জাভা 7 উভয়ের একই ফল ছিল, এজন্যই কেবল একটি ফলাফল সরবরাহ করা হয়েছে (সরবরাহিত 2 লাইন শ্রেণিবদ্ধের বিভিন্ন গভীরতার জন্য) ... এবং না , আমি জাভা ৮ এর সাথে তুলনা করার চেষ্টা করিনি test পুরো পরীক্ষার কোড সরবরাহ করা হয়েছে - আপনি এটি অনুলিপি / আটকানো এবং আপনার প্রয়োজনীয় পরিবেশগুলি পরীক্ষা করতে পারেন (দ্রষ্টব্য - আজকাল আমি এর জন্য জেএমএইচ পরীক্ষার ব্যবহার করব)।
এক্সট্রা কোডার

9

instanceof সত্যই দ্রুত, কেবলমাত্র কয়েকটি সিপিইউ নির্দেশনা নিয়ে।

স্পষ্টতই, যদি কোনও শ্রেণীর Xকোনও সাবক্লাস লোড হয় না (জেভিএম জানে), instanceofএটি হিসাবে অনুকূলিত হতে পারে:

     x instanceof X    
==>  x.getClass()==X.class  
==>  x.classID == constant_X_ID

মূল ব্যয়টি কেবল একটি পঠন!

যদি Xসাবক্লাসগুলি লোড করা থাকে তবে আরও কয়েকটি পাঠ্য প্রয়োজন; তারা সম্ভবত সহ-অবস্থিত তাই অতিরিক্ত ব্যয়ও খুব কম।

সবাইকে সুখবর!


2
করতে অপ্টিমাইজ করা বা হয় অপ্টিমাইজ? সূত্র?

@vaxquis করতে পারেন তার JVM impl নির্দিষ্ট যেমন
RecursiveExceptionException

@itzJanuary দীর্ঘশ্বাস তুমি আমার প্রশ্নের এখানে বিন্দু মিস: সবাই জানে যে কম্পাইলার করতে নিখুত foo- কিন্তু করা হয় fooআসলে বর্তমানে ওরাকল এর javac / VM- র দ্বারা অপ্টিমাইজ - অথবা এটা ঠিক যে এটি ভবিষ্যতে যে কি করব সম্ভব? এছাড়াও, আমি উত্তরদাতাকে জিজ্ঞাসা করেছি যে তার কাছে কি কোনও ব্যাকিং সোর্স রয়েছে (এটি ডক্স, উত্স কোড, দেব ব্লগ হোক) ডকুমেন্টিং যা সত্যই এটি অনুকূলিত হতে পারে বা অনুকূলিত করা যায় ? এটি ছাড়া, এই উত্তরটি কম্পাইলার সম্ভবত কী করতে পারে তা নিয়ে কিছু র্যান্ডম সংগীত ।

@ ভ্যাক্সকুইস আপনি হটস্পট ভিএম এর কথা কখনও উল্লেখ করেননি তবে সে ক্ষেত্রে এটি "অপ্টিমাইজড" কিনা তা আমি জানি না।
পুনরাবৃত্তি

1
সম্প্রতি পড়ুন যে জেআইটি (জেভিএম 8) সরাসরি কল করে 1 বা 2 প্রকারের জন্য একটি কল সাইটকে অনুকূলিত করবে, তবে দুটিরও বেশি প্রকৃত ধরণের মুখোমুখি হলে ভিটিবেলে ফিরে আসে। সুতরাং রানটাইমের সময় কেবলমাত্র দুটি কংক্রিট ধরণের কল সাইট থেকে পাস করা একটি পারফরম্যান্স সুবিধার প্রতিনিধিত্ব করে।
সাইমন.ওয়াটস

5

Instanceof খুব দ্রুত। এটি বাইটকোডে ফোটায় যা শ্রেণি রেফারেন্স তুলনার জন্য ব্যবহৃত হয়। একটি লুপে কয়েক মিলিয়ন উদাহরণ চেষ্টা করুন এবং নিজের জন্য দেখুন।


5

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

তা কেন? কারণ সম্ভবত যা হতে চলেছে তা হ'ল আপনার কয়েকটি ইন্টারফেস রয়েছে যা কিছু কার্যকারিতা সরবরাহ করে (ধরা যাক, ইন্টারফেস এক্স, ওয়াই এবং জেড), এবং এমন কিছু জিনিস যাতে হস্তান্তর করতে পারে যা সেই ইন্টারফেসগুলির মধ্যে একটি বাস্তবায়ন করতে পারে (বা না) ... তবে সরাসরি না বলুন, উদাহরণস্বরূপ, আমার কাছে রয়েছে:

w প্রসারিত এক্স

একটি প্রয়োগ ডাব্লু

বি প্রসারিত হয় এ

সি বি প্রসারিত করে, y প্রয়োগ করে

ডি সি প্রসারিত করে, জেড প্রয়োগ করে

ধরুন আমি ডি এর একটি উদাহরণ প্রক্রিয়া করছি, বস্তু d। গণনা (ডি উদাহরণস্বরূপ x) এর জন্য d.getClass () নেওয়া উচিত, এটি ইন্টারফেসের মাধ্যমে লুপ নিতে হবে যেগুলি = = থেকে x হয় কিনা তা জানতে, এবং যদি না করে থাকে তবে তাদের পূর্বসূরীদের জন্য আবার পুনরাবৃত্তি করুন ... আমাদের ক্ষেত্রে, আপনি যদি সেই গাছটির প্রথম প্রস্থে অনুসন্ধান করেন তবে কমপক্ষে 8 টি তুলনা পাওয়া যায়, মনে করুন y এবং z এর পরিমাণ বাড়বে না ...

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

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

এখানে আমার 2 সেন্ট, আমি আশা করি তারা সাহায্য করবে ...


5

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

আপনি যদি xClass == স্ট্রিংক্লাস ব্যবহার করতে পারেন তবে এটি দ্রুত। দ্রষ্টব্য: আপনার চূড়ান্ত ক্লাসের জন্য উদাহরণ প্রয়োজন নেই।


1
Btw "চূড়ান্ত ক্লাসগুলির জন্য উদাহরণ প্রয়োজন নেই" বলতে কী বোঝায়?
পেসারিয়ার

একটি চূড়ান্ত শ্রেণিতে সাব ক্লাস থাকতে পারে না। এই ক্ষেত্রে x.getClass() == Class.classএকই হয়x instanceof Class
পিটার লরি

শীতল, ধরে নিচ্ছি যে এক্স নাল নয়, আপনি কোনটি পছন্দ করবেন?
পেসারিয়ার

ভাল যুক্তি. এটা তোলে উপর নির্ভর করবে কিনা আমি আশা xকরা nullআমি অনুমান। (বা যে
কোনওটি

হুম আমি ঠিক বুঝতে পেরেছি যে আমরা java.lang.class.isAssignableFromও ব্যবহার করতে পারি, আপনি কি সচেতন হন যদি উদাহরণস্বরূপ কীওয়ার্ডটি অভ্যন্তরীণভাবে এই জাতীয় ফাংশন ব্যবহার করে?
প্যাসেরিয়ার

4

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

if (o instanceof Class1)
   doThis();
else if (o instanceof Class2)
   doThat();
//...

আপনি এটি দিয়ে প্রতিস্থাপন করতে পারেন

o.doEverything();

এবং তারপরে ক্লাস 1 কল "doThis ()" এবং "ক্লাস 2 কল" doThat () "এবং" আরও কিছুতে "doE Everything ()" বাস্তবায়ন আছে।


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

4

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

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


4

ডেমিয়ান এবং পল একটি ভাল বিষয় উল্লেখ করেছেন; যাহোক , কার্যকর করতে কোডটির অবস্থানটি নির্ভর করে আপনি কীভাবে ডেটা ব্যবহার করতে চান তার উপর নির্ভর করে ...

আমি ছোট ডেটা অবজেক্টের একটি বড় ফ্যান যা বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে। আপনি যদি ওভাররাইড (পলিমারফিক) পদ্ধতির অনুসরণ করেন তবে আপনার অবজেক্টগুলি কেবল "এক উপায়" ব্যবহার করা যেতে পারে।

এখানেই নিদর্শনগুলি আসে ...

প্রতিটি বস্তুকে "নিজেকে কল করতে" বলার জন্য ডাবল-প্রেরণ (দর্শকের প্যাটার্নের মতো) ব্যবহার করতে পারেন - এটি বস্তুর ধরণের সমাধান করবে। যাহোক (আবার) আপনার এমন একটি শ্রেণীর প্রয়োজন যা সম্ভাব্য সমস্ত উপ টাইপের সাথে "স্টাফ" করতে পারে।

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

আশা করি এটি আরও কিছু ধারণা অনুপ্রাণিত করবে ...

package com.javadude.sample;

import java.util.HashMap;
import java.util.Map;

public class StrategyExample {
    static class SomeCommonSuperType {}
    static class SubType1 extends SomeCommonSuperType {}
    static class SubType2 extends SomeCommonSuperType {}
    static class SubType3 extends SomeCommonSuperType {}

    static interface Handler<T extends SomeCommonSuperType> {
        Object handle(T object);
    }

    static class HandlerMap {
        private Map<Class<? extends SomeCommonSuperType>, Handler<? extends SomeCommonSuperType>> handlers_ =
            new HashMap<Class<? extends SomeCommonSuperType>, Handler<? extends SomeCommonSuperType>>();
        public <T extends SomeCommonSuperType> void add(Class<T> c, Handler<T> handler) {
            handlers_.put(c, handler);
        }
        @SuppressWarnings("unchecked")
        public <T extends SomeCommonSuperType> Object handle(T o) {
            return ((Handler<T>) handlers_.get(o.getClass())).handle(o);
        }
    }

    public static void main(String[] args) {
        HandlerMap handlerMap = new HandlerMap();

        handlerMap.add(SubType1.class, new Handler<SubType1>() {
            @Override public Object handle(SubType1 object) {
                System.out.println("Handling SubType1");
                return null;
            } });
        handlerMap.add(SubType2.class, new Handler<SubType2>() {
            @Override public Object handle(SubType2 object) {
                System.out.println("Handling SubType2");
                return null;
            } });
        handlerMap.add(SubType3.class, new Handler<SubType3>() {
            @Override public Object handle(SubType3 object) {
                System.out.println("Handling SubType3");
                return null;
            } });

        SubType1 subType1 = new SubType1();
        handlerMap.handle(subType1);
        SubType2 subType2 = new SubType2();
        handlerMap.handle(subType2);
        SubType3 subType3 = new SubType3();
        handlerMap.handle(subType3);
    }
}

4

আমি জেএমএইচ-জাভা-বেঞ্চমার্ক-আর্কিটাইপ: 2.21 এর উপর ভিত্তি করে একটি পারফরম্যান্স পরীক্ষা লিখি। জেডি কে ওপেনজেডকে এবং সংস্করণটি 1.8.0_212। পরীক্ষা মেশিন ম্যাক প্রো। পরীক্ষার ফলাফল:

Benchmark                Mode  Cnt    Score   Error   Units
MyBenchmark.getClasses  thrpt   30  510.818 ± 4.190  ops/us
MyBenchmark.instanceOf  thrpt   30  503.826 ± 5.546  ops/us

ফলাফলটি দেখায় যে: getClass উদাহরণের চেয়ে ভাল, যা অন্যান্য পরীক্ষার সাথে বিপরীত। তবে কেন জানি না।

পরীক্ষার কোডটি নীচে রয়েছে:

public class MyBenchmark {

public static final Object a = new LinkedHashMap<String, String>();

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public boolean instanceOf() {
    return a instanceof Map;
}

@Benchmark
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public boolean getClasses() {
    return a.getClass() == HashMap.class;
}

public static void main(String[] args) throws RunnerException {
    Options opt =
        new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).warmupIterations(20).measurementIterations(30).forks(1).build();
    new Runner(opt).run();
}
}

যদি আমি অনুমান করতেই পারি, উদাহরণস্বরূপ কোনটি করা হয় তা তর্কযুক্তভাবে আরও জটিল। একটি getClass () == চেকটি সুনির্দিষ্ট 1: 1 চেক করবে, যেখানে উদাহরণস্বরূপ যেমন হায়ারার্কি পরীক্ষা করে যেমন মাই হ্যাশসেট উদাহরণস্বরূপ সংগ্রহটি পাস করবে তবে myHashSet.getClass () == সংগ্রহ.ক্লাসটি তা করবে না। মূলত, এগুলি সমতুল্য অপারেশন নয়, তাই পারফরম্যান্সটিও আলাদা বলে আমি খুব আশ্চর্য হই না।
এএমটার্প

3

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

if (o instanceof java.lang.String)

নিম্নলিখিত সি কোড হিসাবে দ্রুত হতে পারে

if (objectStruct->iAmInstanceOf == &java_lang_String_class)

ধরে নিই যে একটি জেআইটি সংকলক রয়েছে এবং একটি ভাল কাজ করে।

এটি কেবলমাত্র একটি পয়েন্টারে অ্যাক্সেস করছে তা বিবেচনা করে, নির্দিষ্ট পয়েন্টারে পয়েন্টারটি পয়েন্টারটি পয়েন্টারটিকে অন্য পয়েন্টারের সাথে তুলনা করে (যা মূলত 32 বিট সংখ্যার সমান হওয়ার সাথে টেস্টিংয়ের সমান), আমি বলব অপারেশনটি আসলে করতে পারে খুব দ্রুত হতে

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


1
এটি java.lang.String থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কিনা তা খুঁজে বের করতে হবে না?
ডাব্লুডাব্লু

1
সে কারণেই আমি বলেছিলাম এটি "সম্ভবত" তত দ্রুত হতে পারে। বাস্তবে এটি একটি লুপ সঞ্চালন করে, প্রথমে প্রশ্নযুক্ত শ্রেণীর বিরুদ্ধে iAmInstanceOf পরীক্ষা করে, তারপরে এটি ও এর উত্তরাধিকার গাছের উপরের দিকে যায় এবং ও এর প্রতিটি সুপার-ক্লাসের জন্য এই চেকটি পুনরাবৃত্তি করে (যাতে এটি এই লুপটি কয়েকবার চালাতে পারে might একটি ম্যাচের জন্য)
মক্কি

3

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


2

উদাহরণস্বরুপ হ'ল দুর্বল অবজেক্ট ওরিয়েন্টড ডিজাইনের একটি সতর্কতা।

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

একটি খুব ছোট সরল প্রোগ্রামিং উদাহরণ দিতে।

if (SomeObject instanceOf Integer) {
  [do something]
}
if (SomeObject instanceOf Double) {
  [do something different]
}

দুর্বল আর্কিটেকচারটি কি আরও ভাল পছন্দ হ'ল সামোবজেক্টটি দুটি শিশু শ্রেণির পিতামাতার শ্রেণি যেখানে প্রতিটি শিশু শ্রেণি একটি পদ্ধতি (doSomething) ওভাররাইড করে তাই কোডটি এর মতো দেখায়:

Someobject.doSomething();

61
আমি এটার ব্যাপারে অবগত. আমি যা চেয়েছিলাম তা ছিল না।
জোশ

এটি একটি ভাল পয়েন্ট হওয়ায় এটিকে ভোট দেবে কি না তা নিশ্চিত নয়, তবে জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না ...
jklp

7
আমি মনে করি কোডের উদাহরণটি আসলে খুব খারাপ: আপনি ডাবল ক্লাসটি প্রসারিত করতে পারবেন না এবং অন্য কোনও শ্রেণীর থেকে ডাবল বের করতে পারবেন না। উদাহরণস্বরূপ আপনি যদি অন্যান্য ক্লাস ব্যবহার করেন তবে তা ঠিক আছে।
লেনা শিমেল

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

স্ব রান্নার পাই এবং রোস্ট যদিও দুর্দান্ত হবে
binboavetonik

2

আধুনিক জাভা সংস্করণে ইনস্ট্যান্স অফ অপারেটর একটি সাধারণ পদ্ধতি কল হিসাবে দ্রুত। এর অর্থ:

if(a instanceof AnyObject){
}

তত দ্রুত:

if(a.getType() == XYZ){
}

আরেকটি বিষয় হ'ল আপনার যদি অনেকগুলি উদাহরণ ক্যাসকেড করার দরকার হয়। তারপরে একটি স্যুইচ যা কেবলমাত্র একবার getType () একবার কল করে faster


1

যদি গতি আপনার একমাত্র লক্ষ্য হয় তবে সাব ক্লাসেন্টগুলি সনাক্ত করতে ইনট কনস্ট্যান্ট ব্যবহার করা সময়ের এক মিলি সেকেন্ড শেভ করে বলে মনে হচ্ছে

static final int ID_A = 0;
static final int ID_B = 1;
abstract class Base {
  final int id;
  Base(int i) { id = i; }
}
class A extends Base {
 A() { super(ID_A); }
}
class B extends Base {
 B() { super(ID_B); }
}
...
Base obj = ...
switch(obj.id) {
case  ID_A: .... break;
case  ID_B: .... break;
}

ভয়াবহ ওও ডিজাইন, তবে যদি আপনার পারফরম্যান্স বিশ্লেষণটি ইঙ্গিত দেয় তবে এটিই যেখানে আপনি বাধা দিচ্ছেন সম্ভবত। আমার কোডে প্রেরণ কোডটি মোট কার্যকরকরণের 10% সময় নেয় এবং এটি সম্ভবত 1% মোট গতির উন্নতিতে অবদান রাখে।


0

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

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


0

পিটার লরির নোট সম্পর্কিত যে আপনার চূড়ান্ত শ্রেণির জন্য উদাহরণ প্রয়োজন নেই এবং কেবল একটি রেফারেন্স সাম্যতা ব্যবহার করতে পারেন, সাবধান! যদিও চূড়ান্ত শ্রেণিগুলি বাড়ানো যায় না, তবুও তারা একই শ্রেণিবদ্ধার দ্বারা লোড হওয়ার গ্যারান্টিযুক্ত নয়। কেবলমাত্র x.getClass () == SomeFinal.class বা এর জাতীয় ব্যবহার করুন যদি আপনি একেবারে ইতিবাচক হন যে কোডের এই বিভাগের জন্য খেলতে কেবলমাত্র একটি ক্লাস লোডার রয়েছে।


4
কোনও শ্রেণি যদি অন্য কোনও ক্লাস লোডার দ্বারা লোড করা হয় তবে আমি মনে করি না উদাহরণগুলি কোনওরকম মিলবে।
পিটার ল্যারি

0

আমি একটি এনাম পদ্ধতির পছন্দও করি, তবে আমি সাবস্ট্রাক্টগুলি পদ্ধতিটি প্রয়োগ করতে বাধ্য করার জন্য একটি বিমূর্ত বেস ক্লাস ব্যবহার করব getType()

public abstract class Base
{
  protected enum TYPE
  {
    DERIVED_A, DERIVED_B
  }

  public abstract TYPE getType();

  class DerivedA extends Base
  {
    @Override
    public TYPE getType()
    {
      return TYPE.DERIVED_A;
    }
  }

  class DerivedB extends Base
  {
    @Override
    public TYPE getType()
    {
      return TYPE.DERIVED_B;
    }
  }
}

0

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

if (!(seq instanceof SingleItem)) {
  seq = seq.head();
}

যেখানে একক আইটেমকে হেড () কল করলে মানটি অপরিবর্তিত থাকে। কোড দ্বারা প্রতিস্থাপন

seq = seq.head();

লুপটিতে স্ট্রিং-টু-ডাবল রূপান্তরকরণের মতো কিছু বেশ ভারী জিনিস ঘটছে সত্ত্বেও আমাকে 269ms থেকে 169ms গতিবেগ দেয়। এটি অবশ্যই সম্ভব যে শর্তসাপেক্ষ শাখাটি অপসারণের চেয়ে অপারেটরকে বাদ দেওয়ার চেয়ে গতি বাড়ানো বেশি; তবে আমি এটি উল্লেখ করার মতো মনে করেছি।


এটি ifনিজের কারণেই হতে পারে । যদি trues এবং falses এর বিতরণ সমানর কাছাকাছি হয়, তবে অনুমানমূলক সম্পাদন অকেজো হয়ে যায়, যা উল্লেখযোগ্য পিছনে বাড়ে।
Dmytro

-4

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


7
এটি আগের তুলনায় যত বেশি আধুনিক জাভা আবর্জনা সংগ্রহের অ্যালগরিদমগুলির তুলনায় অনেক কম সত্য। এমনকি সাধারণ অ্যালগরিদমগুলি আপনি ব্যবহারের পরে ঠিক কতটা মেমোরি ফেলে রাখেন সেদিকেও খেয়াল রাখে না - তারা কেবল যুব-প্রজন্মের সংগ্রহ জুড়ে কতটুকু বজায় রাখবে তা যত্নশীল।
বিল মিশেল

3
দুর্দান্ত, আমি খুব সাম্প্রতিক জেভিএম এ ছাড়া আর জিসি চললে আমার কম্পিউটার এখনও হামাগুড়ি দেয়। ডুয়াল-কোর, 3 জিবি র‌্যাম সার্ভারে। জাভা ব্যবহারের জন্য কোনও ভাষা নয় যদি পারফরম্যান্সটি আসলে বিবেচনা করে।
tloach

@ ডেভিড: আপনার অ্যাপ্লিকেশন সময়কালের জন্য চলে গেলে সমস্যাগুলির জন্য আপনাকে রিয়েল-টাইম প্রয়োজন হয় না। আমি যে মজার মুখোমুখি হয়েছি তা হ'ল একটি জাভা অ্যাপ্লিকেশন যা একটি টিসিপি স্ট্রিমের সাথে সংযুক্ত ছিল যা মারা গিয়েছিল যখন জিসি দৌড়েছিল কারণ এটি প্রথমে স্ট্রিমটি বন্ধ করে না এবং নেটওয়ার্ক ট্র্যাফিকের ওভারলোডটি যখন ফিরে আসে তা পরিচালনা করতে পারে না - এটি তখনই হবে জিসি চালায় এমন একটি লুপে যান, যখন অ্যাপ পুনরায় চালু হয় তখন এটি একগুচ্ছ ডেটা দিয়ে মন্থন করার চেষ্টা করে, যা এটিকে স্মৃতিশক্তি থেকে সরিয়ে দেয়, যা জিসি ইত্যাদিকে ট্রিগার করেছিল etc. ইত্যাদি জাভা প্রচুর কাজের জন্য দুর্দান্ত, তবে খুব কার্য নয় যেখানে খুব শক্তিশালী কর্মক্ষমতা একটি প্রয়োজন।
tloach

6
@ টোলচ আমার কাছে খারাপ অ্যাপ্লিকেশন ডিজাইনের মতো শোনাচ্ছে। আপনি "পারফরম্যান্স" সম্পর্কে এমন কথা বলছেন যেন এটি এক-মাত্রিক। আমি প্রচুর জাভা অ্যাপসের সাথে কাজ করেছি এবং উদাহরণস্বরূপ, খুব বড় ডেটা সেটগুলির সংক্ষিপ্ত ইন্টারেক্টিভ পরিসংখ্যান বিশ্লেষণ এবং ভিজ্যুয়ালাইজেশন সরবরাহ করতে পারফর্মেন্ট বা খুব দ্রুত লেনদেনের পরিমাণগুলি খুব দ্রুত প্রক্রিয়াকরণে পারফর্মেন্ট। "পারফরম্যান্স" কেবল একটি জিনিস নয়, এবং কেউ এমন একটি অ্যাপ্লিকেশন লিখতে পারেন যা মেমরিকে খারাপভাবে পরিচালিত করে এবং জিসিকে তার নিজের উপায়ে পেতে দেয় তার অর্থ এই নয় যে "পারফরম্যান্স" প্রয়োজন এমন কিছু অন্য কোনও কিছুতে লেখা উচিত।
ডেভিড মোলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.