জাভা স্ট্যাটিক কলগুলি কি অ স্থিত কলগুলির চেয়ে কম বা কম ব্যয়বহুল?


উত্তর:


73

প্রথম: আপনার পারফরম্যান্সের ভিত্তিতে স্থির বনাম অ স্থির নির্বাচন করা উচিত নয়।

দ্বিতীয়: অনুশীলনে, এটি কোনও পার্থক্য করবে না। হটস্পট এমন পদ্ধতিতে অনুকূলিতকরণ চয়ন করতে পারে যেগুলি একটি পদ্ধতির জন্য স্থির কলগুলি দ্রুত করে তোলে, অন্যের জন্য অ স্থিত কলগুলি দ্রুত faster

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


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

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

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

7
ডাউনভোটড এটি প্রশ্নের উত্তর দেয় না। কর্মক্ষমতা সুবিধাগুলি সম্পর্কে প্রশ্ন জিজ্ঞাসা করা হয়েছিল। এটি নকশার নীতিগুলির বিষয়ে মতামত চেয়েছিল না।
কলম ভান্ডাল

4
আমি যদি কোনও তোতা প্রশিক্ষণের জন্য বলি যে "অকালতাত্ত্বিক উন্নতি সমস্ত কুফলের মূল" "আমি এমন লোকদের কাছ থেকে 1000 ভোট পেয়েছি যারা তোতা হিসাবে পারফরম্যান্স সম্পর্কে বেশি জানেন।
rghome

62

চার বছর পরে...

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

আমি এটি আদর্শের উপর চালিয়েছি , এবং এটি আমি পেয়েছি:

(পুনরাবৃত্তির বৃহত সংখ্যা ভাল)

    Success time: 3.12 memory: 320576 signal:0
  Name          |  Iterations
    VirtualTest |  128009996
 NonVirtualTest |  301765679
     StaticTest |  352298601
Done.

প্রত্যাশিত হিসাবে, ভার্চুয়াল পদ্ধতি কলগুলি সবচেয়ে ধীর, অ-ভার্চুয়াল পদ্ধতি কলগুলি দ্রুত এবং স্থির পদ্ধতি কলগুলি আরও দ্রুত।

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

আমি মনে করি ফলাফলগুলি সিপিইউ থেকে সিপিইউতে এবং জেভিএম থেকে জেভিএম-এ পরিবর্তিত হবে, তাই এটি চেষ্টা করে দেখুন কী পাবেন:

import java.io.*;

class StaticVsInstanceBenchmark
{
    public static void main( String[] args ) throws Exception
    {
        StaticVsInstanceBenchmark program = new StaticVsInstanceBenchmark();
        program.run();
    }

    static final int DURATION = 1000;

    public void run() throws Exception
    {
        doBenchmark( new VirtualTest( new ClassWithVirtualMethod() ), 
                     new NonVirtualTest( new ClassWithNonVirtualMethod() ), 
                     new StaticTest() );
    }

    void doBenchmark( Test... tests ) throws Exception
    {
        System.out.println( "  Name          |  Iterations" );
        doBenchmark2( devNull, 1, tests ); //warmup
        doBenchmark2( System.out, DURATION, tests );
        System.out.println( "Done." );
    }

    void doBenchmark2( PrintStream printStream, int duration, Test[] tests ) throws Exception
    {
        for( Test test : tests )
        {
            long iterations = runTest( duration, test );
            printStream.printf( "%15s | %10d\n", test.getClass().getSimpleName(), iterations );
        }
    }

    long runTest( int duration, Test test ) throws Exception
    {
        test.terminate = false;
        test.count = 0;
        Thread thread = new Thread( test );
        thread.start();
        Thread.sleep( duration );
        test.terminate = true;
        thread.join();
        return test.count;
    }

    static abstract class Test implements Runnable
    {
        boolean terminate = false;
        long count = 0;
    }

    static class ClassWithStaticStuff
    {
        static int staticDummy;
        static void staticMethod() { staticDummy++; }
    }

    static class StaticTest extends Test
    {
        @Override
        public void run()
        {
            for( count = 0;  !terminate;  count++ )
            {
                ClassWithStaticStuff.staticMethod();
            }
        }
    }

    static class ClassWithVirtualMethod implements Runnable
    {
        int instanceDummy;
        @Override public void run() { instanceDummy++; }
    }

    static class VirtualTest extends Test
    {
        final Runnable runnable;

        VirtualTest( Runnable runnable )
        {
            this.runnable = runnable;
        }

        @Override
        public void run()
        {
            for( count = 0;  !terminate;  count++ )
            {
                runnable.run();
            }
        }
    }

    static class ClassWithNonVirtualMethod
    {
        int instanceDummy;
        final void nonVirtualMethod() { instanceDummy++; }
    }

    static class NonVirtualTest extends Test
    {
        final ClassWithNonVirtualMethod objectWithNonVirtualMethod;

        NonVirtualTest( ClassWithNonVirtualMethod objectWithNonVirtualMethod )
        {
            this.objectWithNonVirtualMethod = objectWithNonVirtualMethod;
        }

        @Override
        public void run()
        {
            for( count = 0;  !terminate;  count++ )
            {
                objectWithNonVirtualMethod.nonVirtualMethod();
            }
        }
    }

    static final PrintStream devNull = new PrintStream( new OutputStream() 
    {
        public void write(int b) {}
    } );
}

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

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


7
'ভার্চুয়াল' একটি সি ++ পদ। জাভাতে কোনও ভার্চুয়াল পদ্ধতি নেই। এখানে সাধারণ পদ্ধতি রয়েছে, যা রানটাইম-পলিমারফিক এবং স্থির বা চূড়ান্ত পদ্ধতিগুলি নয়।
ঝেনিয়া

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

13
অকাল অপটিমাইজেশন সম্পর্কে অনুমান না করে প্রশ্নের উত্তর দেওয়ার জন্য ধন্যবাদ। দুর্দান্ত উত্তর।
vegemite4me

4
হ্যাঁ, এটাই আমি বোঝাতে চাইছিলাম। যাইহোক আমি কেবল আমার মেশিনে পরীক্ষা চালিয়েছি। এই জাতীয় বেঞ্চমার্কের জন্য আপনি আশা করতে পারেন এমন জট ছাড়াও VirtualTest | 488846733 -- NonVirtualTest | 480530022 -- StaticTest | 484353198, আমার ওপেনজেডিকে ইনস্টলেশনতে গতিতে কোনও পার্থক্য নেই । এফটিআর: আমি যদি finalমডিফায়ারটি সরিয়ে ফেলি তবে এটি এমনকি সত্য । বিটিডব্লিউ আমাকে terminateক্ষেত্র তৈরি করতে হবে volatile, অন্যথায় পরীক্ষা শেষ হয়নি।
মার্টেন

4
এফওয়াইআই, আমি একটি নেক্সাস 5 চলমান অ্যান্ড্রয়েড 6: এর পরিবর্তে অবাক করা ফলাফল পেয়েছি VirtualTest | 12451872 -- NonVirtualTest | 12089542 -- StaticTest | 8181170। আমার নোটবুকের ওপেনজেডিকে কেবল 40x আরও পুনরুক্তি পরিচালনার পক্ষে নয়, স্থির পরীক্ষায় সর্বদা 30% কম থ্রুপুট থাকে put এটি একটি এআরটি নির্দিষ্ট ঘটনা হতে পারে, কারণ আমি একটি অ্যান্ড্রয়েড ৪.৪ ট্যাবলেটে প্রত্যাশিত ফলাফল পেয়েছি:VirtualTest | 138183740 -- NonVirtualTest | 142268636 -- StaticTest | 161388933
মার্টেন

45

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

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


স্ট্যাটিক কল দ্রুত হওয়ার কারণেই তারা এগুলি সম্ভব কারণ আপনি কি আমাকে সে কারণগুলি ব্যাখ্যা করতে পারেন ?
জাভাটেকনিকাল

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

6
@ জাভা টেকনিক্যাল: আমি বুঝতে পারছি না। আমি সবেমাত্র আপনাকে এমন জিনিস দিয়েছি যেগুলি একটি অন্তর্নিহিত সুযোগের পাশাপাশি স্থির পদ্ধতিগুলির জন্য গণনা / পরীক্ষা করার প্রয়োজন নেই। কাজ না করা একটি পারফরম্যান্স সুবিধা। কী বোঝার বাকি আছে?
জন স্কিটি

স্থিতিশীল ভেরিয়েবলগুলি কি অ-স্থির ভেরিয়েবলগুলির চেয়ে দ্রুত পুনরুদ্ধার করা হয়?
জাভাটেকনিকাল

4
@ জাভাটেকনিক্যাল: ওয়েল করার জন্য কোনও নালিশতা পরীক্ষা নেই - তবে জেআইটি সংকলক যদি সেই চেকটি মুছে ফেলতে পারে (যা প্রসঙ্গ-নির্দিষ্ট হবে) তবে আমি খুব বেশি পার্থক্য আশা করতে পারব না। মেমরিটি ক্যাশে রয়েছে কিনা এর মতো বিষয়গুলি আরও গুরুত্বপূর্ণ হবে।
জন স্কিটি

18

এটি সংকলক / ভিএম নির্দিষ্ট।

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

সুতরাং আপনি এটি আপনার আবেদনটিতে সত্যিকারের সমালোচনামূলক পারফরম্যান্স সমস্যা হিসাবে চিহ্নিত না করে অবহেলা করার জন্য সম্ভবত এটি মাথা ঘামানোর মতো নয়। অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দ ইত্যাদির মূল ...

তবে আছে দেখা এই অপ্টিমাইজেশান নিম্নলিখিত অবস্থায় সুত্রে কর্মক্ষমতা বৃদ্ধি করা উচিত:

  • কোনও স্মৃতি অ্যাক্সেস ছাড়াই একটি খুব সাধারণ গাণিতিক গণনা সম্পাদনের পদ্ধতি
  • একটি শক্ত অভ্যন্তরীণ লুপে প্রতি সেকেন্ডে কয়েক মিলিয়ন বার আহ্বান করার পদ্ধতি
  • সিপিইউ বাউন্ড অ্যাপ্লিকেশন যেখানে প্রতিটি বিট পারফরম্যান্স মেটে

যদি উপরেরটি আপনার ক্ষেত্রে প্রযোজ্য হয় তবে এটি পরীক্ষার পক্ষে মূল্যবান হতে পারে।

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


13

অবিশ্বাস্যভাবেই অসম্ভাব্য যে স্ট্যাটিক বনাম অ স্থিত কলগুলির কার্য সম্পাদনে যে কোনও পার্থক্য আপনার আবেদনে একটি পার্থক্য আনছে। মনে রাখবেন যে "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল"।



আপনি কি দয়া করে আরও ব্যাখ্যা করবেন "" অকালীন অপটিমাইজেশন সমস্ত অশুভের মূল "?"
ব্যবহারকারী2121

প্রশ্নটি ছিল "কোনও উপায়ে কোনও উপায়ে কোনও উপকারের সুবিধা আছে?" এবং এটি সেই প্রশ্নের সঠিক উত্তর দেয়।
DJClayworth

13

আগের পোস্টারগুলি যেমন বলেছে: এটি অকাল অপটিমাইজেশনের মতো বলে মনে হচ্ছে।

তবে, এর মধ্যে একটি পার্থক্য রয়েছে (এই অংশের একটি অংশ যে অ স্থিতিক দাওয়াতগুলির জন্য অপারেন্ড স্ট্যাকের উপরে একটি ক্যালি-অবজেক্টের অতিরিক্ত ধাক্কা প্রয়োজন):

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

একটি বাইট-কোড স্তরের উপর পার্থক্য হল যে একটি অ-স্ট্যাটিক পদ্ধতি কল মাধ্যমে সম্পন্ন করা হয় INVOKEVIRTUAL, INVOKEINTERFACEবা INVOKESPECIALযখন একটি স্ট্যাটিক পদ্ধতি কল মাধ্যমে সম্পন্ন করা হয় INVOKESTATIC


4
invokespecialএটি একটি ভার্চুয়াল নয় বলে একটি ব্যক্তিগত উদাহরণ পদ্ধতিটি ব্যবহার করা হচ্ছে (কমপক্ষে সাধারণত) inv
মার্ক পিটারস

আহ, আকর্ষণীয়, আমি কেবল নির্মাতাদের সম্পর্কেই ভাবতে পারি, সে কারণেই আমি এটি বাদ দিয়েছি! ধন্যবাদ! (উত্তর আপডেট করে)
আইয়ুব

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

13

7 বছর পরে ...

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

java -jar target/benchmark.jar

# -- snip --

Benchmark                        Mode  Cnt          Score         Error  Units
MyBenchmark.testInstanceMethod  thrpt  200  414036562.933 ± 2198178.163  ops/s
MyBenchmark.testStaticMethod    thrpt  200  417194553.496 ± 1055872.594  ops/s

আপনি এখানে গিথুবে কোডটি দেখতে পারেন;

https://github.com/nfisher/svsi

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

package ca.junctionbox.svsi;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.infra.Blackhole;

class InstanceSum {
    public int sum(final int a, final int b) {
        return a + b;
    }
}

class StaticSum {
    public static int sum(final int a, final int b) {
        return a + b;
    }
}

public class MyBenchmark {
    private static final InstanceSum impl = new InstanceSum();

    @State(Scope.Thread)
    public static class Input {
        public int a = 1;
        public int b = 2;
    }

    @Benchmark
    public void testStaticMethod(Input i, Blackhole blackhole) {
        int sum = StaticSum.sum(i.a, i.b);
        blackhole.consume(sum);
    }

    @Benchmark
    public void testInstanceMethod(Input i, Blackhole blackhole) {
        int sum = impl.sum(i.a, i.b);
        blackhole.consume(sum);
    }
}

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

হটস্পটের পরিসংখ্যানগুলি ক্লাসপথে ইনস্ট্যান্সসামে কোনও এক্সটেনশন নেই। InstanceSum প্রসারিত এবং পদ্ধতিটি ওভাররাইড করে এমন একটি অন্য শ্রেণি যুক্ত করার চেষ্টা করুন।
মিলন

12

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

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

২) আর একটি সূক্ষ্ম পার্থক্য হ'ল স্থির পদ্ধতিগুলির স্পষ্টতই "এই" উল্লেখ নেই। একই স্বাক্ষর এবং বডি সহ একটি উদাহরণ পদ্ধতির চেয়ে একটি স্ট্যাক ফ্রেমের ফলস্বরূপ ("এটি" বাইটকোড স্তরের স্থানীয় ভেরিয়েবলের স্লট 0-এ রাখা হয়, তবে স্থির পদ্ধতির জন্য স্লট 0 প্রথমটির জন্য ব্যবহৃত হয়) পদ্ধতির পরামিতি)।


5

কোনও পার্থক্য থাকতে পারে এবং এটি কোনও নির্দিষ্ট কোডের কোনও অংশেই যেতে পারে এবং এটি জেভিএমের এমনকি একটি সামান্য প্রকাশের সাথেও পরিবর্তন হতে পারে।

এটি আপনার স্পষ্টতই ভুলে যাওয়া উচিত 97% ক্ষুদ্র কার্যকারিতার একটি অংশ


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

0

তত্ত্বগতভাবে, কম ব্যয়বহুল।

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

তবে আমি এটি পরীক্ষা করিনি।


4
@ আর। বেমরোজ, স্থির সূচনাটির এই প্রশ্নের সাথে কী সম্পর্ক আছে?
কর্ক ওয়াল

@ কির্ক ওয়াল: কারণ স্ট্যাটিক ইনিশিয়ালেশন প্রথমবার ক্লাসটি রেফারেন্স করার পরে সম্পন্ন করা হয় ... প্রথম স্ট্যাটিক পদ্ধতি কলের আগেও including
পাওয়ারলর্ড

@ আর। বেমরোজ, নিশ্চিত, ক্লাসটি ভিএম-তে শুরু করা হচ্ছে। একটি অ-সিকিউটার, আইএমওর মতো মনে হচ্ছে।
কर्क ওল

0

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

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


-2

আমি এখানে অন্যান্য দুর্দান্ত উত্তরগুলি যুক্ত করতে চাই যে এটি আপনার প্রবাহের উপরও নির্ভর করে, উদাহরণস্বরূপ:

Public class MyDao {

   private String sql = "select * from MY_ITEM";

   public List<MyItem> getAllItems() {
       springJdbcTemplate.query(sql, new MyRowMapper());
   };
};

মনোযোগ দিন যে আপনি প্রতিটি কল প্রতি একটি নতুন MyRowMapper অবজেক্ট তৈরি।
পরিবর্তে, আমি এখানে একটি স্থির ক্ষেত্র ব্যবহার করার পরামর্শ দিই।

Public class MyDao {

   private static RowMapper myRowMapper = new MyRowMapper();
   private String sql = "select * from MY_ITEM";

   public List<MyItem> getAllItems() {
       springJdbcTemplate.query(sql, myRowMapper);
   };
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.