জাভাতে স্ট্রিং কনটেনটেশন ওভার স্ট্রিং.ফর্ম্যাট ব্যবহার করা কি আরও ভাল অনুশীলন?


273

String.formatজাভাতে স্ট্রিং কনটেনটেশন ব্যবহারের মধ্যে কোনও উপলব্ধিযোগ্য পার্থক্য আছে ?

আমি ব্যবহার করার ঝোঁক String.formatকিন্তু মাঝে মাঝে পিছলে যায় এবং একটি সংক্ষিপ্তকরণ ব্যবহার। আমি ভাবছিলাম যে একজনের চেয়ে অপরটি ভাল কিনা।

আমি এটি যেভাবে দেখছি, String.formatআপনাকে স্ট্রিংকে "ফর্ম্যাটিং" করতে আরও শক্তি দেয়; এবং সংক্ষিপ্তকরণের অর্থ হ'ল দুর্ঘটনাক্রমে অতিরিক্ত% s রাখার বা একটি হারিয়ে যাওয়ার বিষয়ে আপনাকে চিন্তা করতে হবে না।

String.format আরও খাটো।

কোনটি আরও পঠনযোগ্য তা আপনার মাথা কীভাবে কাজ করে তার উপর নির্ভর করে।


আমি মনে করি আমরা বার্তা ফর্ম্যাট.ফর্ম্যাটটি নিয়ে যেতে পারি। আরও তথ্যের জন্য দয়া করে উত্তর stackoverflow.com/a/56377112/1491414 দেখুন।
গণেশ বিজয়কুমার

উত্তর:


242

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

আপনি যদি নিজের অ্যাপ্লিকেশনটিকে স্থানীয়করণযোগ্য করে তোলার পরিকল্পনা করেন তবে আপনার ফর্ম্যাট টোকেনগুলির জন্য যুক্তি অবস্থানগুলি নির্দিষ্ট করার অভ্যাসেও আসা উচিত:

"Hello %1$s the time is %2$t"

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

String.format("Hello %1$s, your name is %1$s and the time is %2$t", name, time)

1
আপনি কি আমাকে এমন কিছু ডকুমেন্টেশনের দিকে ইঙ্গিত করতে পারেন যা জাভায় আর্গুমেন্ট পজিশন / অর্ডার নিয়ে কীভাবে কাজ করবেন (যেমন, তাদের অবস্থান অনুসারে আর্গুমেন্টগুলি কীভাবে উল্লেখ করবেন)? ধন্যবাদ।
markvgti

13
আগের তুলনায় বেশি দেরী, এলোমেলো জাভা সংস্করণ: ডকস.অরাকল.কম
আকসেল

174

কর্মক্ষমতা সম্পর্কে:

public static void main(String[] args) throws Exception {      
  long start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = "Hi " + i + "; Hi to you " + i*2;
  }
  long end = System.currentTimeMillis();
  System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;

  start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = String.format("Hi %s; Hi to you %s",i, + i*2);
  }
  end = System.currentTimeMillis();
  System.out.println("Format = " + ((end - start)) + " millisecond");
}

সময়সীমার ফলাফলগুলি নিম্নরূপ:

  • কনটেনটেশন = 265 মিলিসেকেন্ড
  • ফর্ম্যাট = 4141 মিলিসেকেন্ড

অতএব, স্ট্রিং.ফোর্মেটের তুলনায় সংক্ষেপণটি আরও দ্রুত।


15
তারা সব খারাপ অনুশীলন। স্ট্রিংবিল্ডার ব্যবহার করুন।
আমির রামিনফার

8
স্ট্রিংবিল্ডার এখানে সুযোগের বাইরে (ওপি প্রশ্ন স্ট্রিং কনটেনটেশন ওভার স্ট্রিং.ফর্ম্যাট তুলনা সম্পর্কে ছিল) তবে আপনি স্ট্রিং বিল্ডার সম্পর্কে ডেটা পারফর্ম করেন?
ইকারো

108
@ আমিরআমিনার: সংকলক স্ট্রিংবিল্ডারে স্বয়ংক্রিয়ভাবে "+" কলগুলিতে রূপান্তর করে।
মার্টিন শ্র্রেডার

40
@ মার্টিনশ্রেডার: আপনি যদি চালান তবে javap -c StringTest.classআপনি দেখতে পাবেন যে সংকলক "+" স্ট্রিংবিল্ডারে রূপান্তর করে কেবলমাত্র যদি আপনি লুপে না থাকেন। যদি কনটেন্টেশন সমস্ত একক লাইনে করা হয় তবে এটি '+' ব্যবহারের সমান, তবে আপনি যদি ব্যবহার করেন myString += "morechars";বা myString += anotherString;একাধিক লাইনে আপনি দেখতে পাবেন যে একাধিক স্ট্রিংবিল্ডার তৈরি হতে পারে, সুতরাং "+" ব্যবহার করা সবসময় দক্ষ হয় না স্ট্রিংবিল্ডার হিসাবে
সিসিপিজ্জা

7
@ জোফ্রে: আমার অর্থ হ'ল লুপগুলি +রূপান্তরিত হয় না StringBuilder.append()বরং পরিবর্তে new StringBuilder()প্রতিটি পুনরাবৃত্তির ক্ষেত্রে ঘটে।
সিসিপিজ্জা

39

যেহেতু পারফরম্যান্স সম্পর্কে আলোচনা রয়েছে আমি অনুভব করেছি যে আমি স্ট্রিংবিল্ডারকে অন্তর্ভুক্ত করে তুলনা করব। এটি প্রকৃতপক্ষে কনক্যাট এবং স্ট্রিং.ফর্ম্যাট বিকল্পের চেয়ে দ্রুত।

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

    String formatString = "Hi %s; Hi to you %s";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = String.format(formatString, i, +i * 2);
    }

    long end = System.currentTimeMillis();
    log.info("Format = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        String s = "Hi " + i + "; Hi to you " + i * 2;
    }

    end = System.currentTimeMillis();

    log.info("Concatenation = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        StringBuilder bldString = new StringBuilder("Hi ");
        bldString.append(i).append("; Hi to you ").append(i * 2);
    }

    end = System.currentTimeMillis();

    log.info("String Builder = " + ((end - start)) + " millisecond");
  • 2012-01-11 16: 30: 46,058 INFO [টেস্টমেইন] - ফর্ম্যাট = 1416 মিলিসেকেন্ড
  • 2012-01-11 16: 30: 46,190 INFO [টেস্টমেইন] - প্রতিযোগিতা = 134 মিলিসেকেন্ড
  • 2012-01-11 16: 30: 46,313 INFO [টেস্টমেইন] - স্ট্রিং বিল্ডার = 117 মিলিসেকেন্ড

21
স্ট্রিংবিল্ডার টেস্টটি স্ট্রিং () কল করে না, সুতরাং এটি একটি উপযুক্ত তুলনা নয়। আমার সন্দেহ হয় আপনি যদি এই বাগটি ঠিক করেন তবে আপনি এটি কনক্যাটেনশনের পারফরম্যান্সের পরিমাপের ত্রুটির মধ্যে খুঁজে পাবেন।
জামে শার্প

15
সংক্ষিপ্তকরণ এবং ফর্ম্যাট পরীক্ষায়, আপনি একটি চেয়েছিলেন String। স্ট্রিংবিল্ডার পরীক্ষাটি সুষ্ঠু হওয়ার জন্য একটি চূড়ান্ত পদক্ষেপ দরকার যা স্ট্রিংবিল্ডারের সামগ্রীগুলি স্ট্রিংয়ে রূপান্তর করে। আপনি ফোন করে তা করেন bldString.toString()। আমি আশা করি যে এটি ব্যাখ্যা করে?
জামে শার্প

4
জামে শার্প ঠিক ঠিক। BldString.toString () চালু করা স্ট্রিং কন্ডাক্টেশনের চেয়ে ধীর না হলে প্রায় একই রকম।
আকোস সিজেড

3
String s = bldString.toString(); সময় সংযুক্তকরণের এবং stringbuilder প্রায় একে অপরের সাথে সমাবস্থা উপর দিয়ে ছিল: Format = 1520 millisecond, Concatenation = 167 millisecond, String Builder = 173 millisecond আমি তাদের লুপ দৌড়ে এবং প্রতিটি বেরিয়ে এলো দারুন এক প্রতিনিধির পেতে গড়: (প্রাক JVM অপ্টিমাইজেশান যখন আমি সময় পান, একটি 10000+ লুপ চেষ্টা করবে)
টেকট্রিপ

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

37

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

বিপরীতে, যুক্তি +সংকলক দ্বারা পরীক্ষা করা যেতে পারে।

নিরাপত্তা ইতিহাস এর(যার উপর formatফাংশনটি মডেল করা হয়) দীর্ঘ এবং ভীতিজনক।


16
কেবল রেকর্ডের জন্য, আধুনিক আইডিই (যেমন ইন্টেলিজ) আর্গুমেন্ট গণনা এবং টাইপ ম্যাচিংয়ে সহায়তা করে
রন ক্লেইন

2
সংকলন সম্পর্কে ভাল বক্তব্য, আমি আপনাকে এই চেকগুলি ফাইন্ডব্যাগগুলির মাধ্যমে (যা আইডিইতে বা বিল্ড চলাকালীন ম্যাভেনের মাধ্যমে চলতে পারে) মাধ্যমে করার পরামর্শ দিচ্ছেন, নোট করুন যে এটি আপনার সমস্ত লগিংয়ের ফর্ম্যাটও চেক করবে! এটি ব্যবহারকারী IDE নির্বিশেষে কাজ করে
ক্রিস্টোফ রাউসি

20

কোনটি আরও পঠনযোগ্য তা আপনার মাথা কীভাবে কাজ করে তার উপর নির্ভর করে।

আপনি আপনার উত্তর ঠিক আছে।

এটি ব্যক্তিগত স্বাদের বিষয়।

আমি মনে করি স্ট্রিং কনটেনটেশন সামান্য দ্রুত হয়, তবে এটি তুচ্ছ হওয়া উচিত।


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

3
প্রকল্পটি যদি ছোট হয় এবং কোনও অর্থবোধের দিক দিয়ে আন্তর্জাতিককরণের উদ্দেশ্যে না হয় তবে এটি কেবল ব্যক্তিগত স্বাদের বিষয়। অন্যথায় স্ট্রিং.ফর্ম্যাট প্রতিটি উপায়ে কনটেনটেশনকে জয় করে।
workmad3

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

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

16

মিলিসেকেন্ডে একাধিক নমুনা আকারের একটি পরীক্ষা এখানে।

public class Time {

public static String sysFile = "/sys/class/camera/rear/rear_flash";
public static String cmdString = "echo %s > " + sysFile;

public static void main(String[] args) {

  int i = 1;
  for(int run=1; run <= 12; run++){
      for(int test =1; test <= 2 ; test++){
        System.out.println(
                String.format("\nTEST: %s, RUN: %s, Iterations: %s",run,test,i));
        test(run, i);
      }
      System.out.println("\n____________________________");
      i = i*3;
  }
}

public static void test(int run, int iterations){

      long start = System.nanoTime();
      for( int i=0;i<iterations; i++){
          String s = "echo " + i + " > "+ sysFile;
      }
      long t = System.nanoTime() - start;   
      String r = String.format("  %-13s =%10d %s", "Concatenation",t,"nanosecond");
      System.out.println(r) ;


     start = System.nanoTime();       
     for( int i=0;i<iterations; i++){
         String s =  String.format(cmdString, i);
     }
     t = System.nanoTime() - start; 
     r = String.format("  %-13s =%10d %s", "Format",t,"nanosecond");
     System.out.println(r);

      start = System.nanoTime();          
      for( int i=0;i<iterations; i++){
          StringBuilder b = new StringBuilder("echo ");
          b.append(i).append(" > ").append(sysFile);
          String s = b.toString();
      }
     t = System.nanoTime() - start; 
     r = String.format("  %-13s =%10d %s", "StringBuilder",t,"nanosecond");
     System.out.println(r);
}

}

TEST: 1, RUN: 1, Iterations: 1
  Concatenation =     14911 nanosecond
  Format        =     45026 nanosecond
  StringBuilder =      3509 nanosecond

TEST: 1, RUN: 2, Iterations: 1
  Concatenation =      3509 nanosecond
  Format        =     38594 nanosecond
  StringBuilder =      3509 nanosecond

____________________________

TEST: 2, RUN: 1, Iterations: 3
  Concatenation =      8479 nanosecond
  Format        =     94438 nanosecond
  StringBuilder =      5263 nanosecond

TEST: 2, RUN: 2, Iterations: 3
  Concatenation =      4970 nanosecond
  Format        =     92976 nanosecond
  StringBuilder =      5848 nanosecond

____________________________

TEST: 3, RUN: 1, Iterations: 9
  Concatenation =     11403 nanosecond
  Format        =    287115 nanosecond
  StringBuilder =     14326 nanosecond

TEST: 3, RUN: 2, Iterations: 9
  Concatenation =     12280 nanosecond
  Format        =    209051 nanosecond
  StringBuilder =     11818 nanosecond

____________________________

TEST: 5, RUN: 1, Iterations: 81
  Concatenation =     54383 nanosecond
  Format        =   1503113 nanosecond
  StringBuilder =     40056 nanosecond

TEST: 5, RUN: 2, Iterations: 81
  Concatenation =     44149 nanosecond
  Format        =   1264241 nanosecond
  StringBuilder =     34208 nanosecond

____________________________

TEST: 6, RUN: 1, Iterations: 243
  Concatenation =     76018 nanosecond
  Format        =   3210891 nanosecond
  StringBuilder =     76603 nanosecond

TEST: 6, RUN: 2, Iterations: 243
  Concatenation =     91222 nanosecond
  Format        =   2716773 nanosecond
  StringBuilder =     73972 nanosecond

____________________________

TEST: 8, RUN: 1, Iterations: 2187
  Concatenation =    527450 nanosecond
  Format        =  10291108 nanosecond
  StringBuilder =    885027 nanosecond

TEST: 8, RUN: 2, Iterations: 2187
  Concatenation =    526865 nanosecond
  Format        =   6294307 nanosecond
  StringBuilder =    591773 nanosecond

____________________________

TEST: 10, RUN: 1, Iterations: 19683
  Concatenation =   4592961 nanosecond
  Format        =  60114307 nanosecond
  StringBuilder =   2129387 nanosecond

TEST: 10, RUN: 2, Iterations: 19683
  Concatenation =   1850166 nanosecond
  Format        =  35940524 nanosecond
  StringBuilder =   1885544 nanosecond

  ____________________________

TEST: 12, RUN: 1, Iterations: 177147
  Concatenation =  26847286 nanosecond
  Format        = 126332877 nanosecond
  StringBuilder =  17578914 nanosecond

TEST: 12, RUN: 2, Iterations: 177147
  Concatenation =  24405056 nanosecond
  Format        = 129707207 nanosecond
  StringBuilder =  12253840 nanosecond

1
আপনি যখন কোনও লুপে অক্ষরগুলি যুক্ত করেন স্ট্রিংবিল্ডার হ'ল দ্রুততম পদ্ধতি, উদাহরণস্বরূপ, আপনি যখন একে একে যুক্ত করে এক হাজার 1 এর সাথে একটি স্ট্রিং তৈরি করতে চান। এখানে আরও তথ্য: pellegrino.link/2015/08/22/…
কার্লোস হোয়োস

আপনি আউটপুট জন্য স্ট্রিং.ফর্ম্যাটটি সর্বদা কীভাবে ব্যবহার করেন তা পছন্দ করি: ডি এর ফলে একটি সুবিধা রয়েছে। এবং সত্য কথা বলতে যদি আমরা লক্ষ লক্ষ পরিবর্তন সম্পর্কে কথা বলি না, তবে আপনার কোডটি সুস্পষ্ট সুবিধা দেখায় আমি পঠনযোগ্যতার জন্য স্ট্রিং ফর্ম্যাট পছন্দ করি!
মোহামনাগ

9

এখানে কলিং সংশোধন সহ উপরে হিসাবে একই পরীক্ষা toString () উপর পদ্ধতি StringBuilder । নীচের ফলাফলগুলি দেখায় যে স্ট্রিংবিল্ডার পদ্ধতিটি + অপারেটর ব্যবহার করে স্ট্রিং কনক্যাটেনটেশনের চেয়ে কিছুটা ধীর ।

ফাইল: স্ট্রিংটেষ্ট.জভা

class StringTest {

  public static void main(String[] args) {

    String formatString = "Hi %s; Hi to you %s";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = String.format(formatString, i, +i * 2);
    }

    long end = System.currentTimeMillis();
    System.out.println("Format = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        String s = "Hi " + i + "; Hi to you " + i * 2;
    }

    end = System.currentTimeMillis();

    System.out.println("Concatenation = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        StringBuilder bldString = new StringBuilder("Hi ");
        bldString.append(i).append("Hi to you ").append(i * 2).toString();
    }

    end = System.currentTimeMillis();

    System.out.println("String Builder = " + ((end - start)) + " millisecond");

  }
}

শেল কমান্ড: (স্ট্রিংটেষ্ট 5 বার সংকলন করুন এবং চালান)

> javac StringTest.java
> sh -c "for i in \$(seq 1 5); do echo \"Run \${i}\"; java StringTest; done"

ফলাফল:

Run 1
Format = 1290 millisecond
Concatenation = 115 millisecond
String Builder = 130 millisecond

Run 2
Format = 1265 millisecond
Concatenation = 114 millisecond
String Builder = 126 millisecond

Run 3
Format = 1303 millisecond
Concatenation = 114 millisecond
String Builder = 127 millisecond

Run 4
Format = 1297 millisecond
Concatenation = 114 millisecond
String Builder = 127 millisecond

Run 5
Format = 1270 millisecond
Concatenation = 114 millisecond
String Builder = 126 millisecond

6

String.format()স্ট্রিং কনটেন্টেটিংয়ের চেয়ে বেশি। উদাহরণস্বরূপ, আপনি একটি নির্দিষ্ট লোকেল ব্যবহার করে নম্বর প্রদর্শন করতে পারেন String.format()

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


4

সাধারণত স্ট্রিং কনটেনটেশনকে অগ্রাধিকার দেওয়া উচিত String.format। পরেরটির দুটি প্রধান অসুবিধা রয়েছে:

  1. এটি স্থানীয় পদ্ধতিতে নির্মিত স্ট্রিংটিকে এনকোড করে না।
  2. বিল্ডিং প্রক্রিয়াটি একটি স্ট্রিংয়ে এনকোড করা হয়।

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

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

অবশ্যই, জাভা ভাষার বাহ্যিক সরঞ্জাম বা ফ্রেমওয়ার্কগুলি ব্যবহার করার সময়, নতুন কারণগুলি কার্যকর হতে পারে।


2

আমি কোনও নির্দিষ্ট মানদণ্ড করিনি, তবে আমি মনে করি যে উপসংহার দ্রুততর হতে পারে। স্ট্রিং.ফর্ম্যাট () একটি নতুন ফর্ম্যাটর তৈরি করে যা পরিবর্তিতভাবে একটি নতুন স্ট্রিংবিল্ডার তৈরি করে (কেবলমাত্র 16 টি অক্ষরের আকার সহ)। এটি ওভারহেডের মোটামুটি পরিমাণে বিশেষত যদি আপনি দীর্ঘতর স্ট্রিং ফর্ম্যাট করে থাকেন এবং স্ট্রিংবিল্ডারকে পুনরায় আকার দিতে হয়।

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

হতে পারে একটি সেরা অনুশীলন হিসাবে, সঠিক আকারের স্ট্রিংবিল্ডার (অ্যাপেন্ডেবল) এবং লোকেল দিয়ে আপনার নিজস্ব ফর্ম্যাটর তৈরি করা ভাল এবং যদি আপনার প্রচুর ফর্ম্যাটিং করতে হয় তবে এটি ব্যবহার করা ভাল idea


2

উপলব্ধিযোগ্য পার্থক্য হতে পারে।

String.format বেশ জটিল এবং নীচে একটি নিয়মিত ভাব প্রকাশ করে, তাই এটিকে সর্বত্র ব্যবহার করার অভ্যাস তৈরি করবেন না, তবে কেবল যেখানে আপনার এটি প্রয়োজন।

StringBuilder দ্রুততর আকারের ক্রম হবে (যেমন এখানে ইতিমধ্যে কেউ নির্দেশ করেছেন)।


1

আমি মনে করি আমরা MessageFormat.formatপাশাপাশি যেতে পারি কারণ এটি পাঠযোগ্যতা এবং পারফরম্যান্স দিক উভয় ক্ষেত্রেই ভাল হওয়া উচিত।

আমি একই প্রোগ্রামটি ব্যবহার করেছি যা একজন তার উপরের উত্তরে আইকারো ব্যবহার করেছিলেন এবং আমি MessageFormatপারফরম্যান্সের সংখ্যাগুলি ব্যাখ্যা করার জন্য এডিং কোড দিয়ে এটিকে বাড়িয়েছি ।

  public static void main(String[] args) {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
      String s = "Hi " + i + "; Hi to you " + i * 2;
    }
    long end = System.currentTimeMillis();
    System.out.println("Concatenation = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
      String s = String.format("Hi %s; Hi to you %s", i, +i * 2);
    }
    end = System.currentTimeMillis();
    System.out.println("Format = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
      String s = MessageFormat.format("Hi %s; Hi to you %s", i, +i * 2);
    }
    end = System.currentTimeMillis();
    System.out.println("MessageFormat = " + ((end - start)) + " millisecond");
  }

কনটেনটেশন = 69 মিলিসেকেন্ড

ফর্ম্যাট = 1435 মিলিসেকেন্ড

বার্তা ফর্ম্যাট = 200 মিলিসেকেন্ড

আপডেট:

সোনারলিন্ট রিপোর্ট অনুসারে, প্রিন্টফ-স্টাইল বিন্যাসের স্ট্রিংগুলি সঠিকভাবে ব্যবহার করা উচিত (স্কুইড: S3457)

কারণ printf-style ফর্ম্যাট স্ট্রিংগুলি রানটাইমগুলিতে সংকলক দ্বারা বৈধ হওয়ার পরিবর্তে ব্যাখ্যা করা হয়, সেগুলিতে ত্রুটি থাকতে পারে যার ফলে ভুল স্ট্রিং তৈরি হয় created এই নিয়ম স্ট্যাটিক্যালি এর পারস্পরিক সম্পর্ক যাচাই printf-styleযখন বিন্যাস (...) পদ্ধতি কলিং তাদের আর্গুমেন্ট বিন্যাস স্ট্রিং java.util.Formatter, java.lang.String, java.io.PrintStream, MessageFormat, এবং java.io.PrintWriterক্লাস এবং printf(...)পদ্ধতি java.io.PrintStreamবা java.io.PrintWriterক্লাস।

আমি মুদ্রক-বন্ধনীগুলির সাথে মুদ্রণ-শৈলীটি প্রতিস্থাপন করেছি এবং নীচের মতো আমি আকর্ষণীয় কিছু পেয়েছি।

সংমিশ্রণ = 69 মিলিসেকেন্ড
ফর্ম্যাট = 1107 মিলিসেকেন্ড
ফর্ম্যাট: কোঁকড়ানো-বন্ধনী = 416 মিলিসেকেন্ড
বার্তা ফর্ম্যাট = 215 মিলিসেকেন্ড
বার্তা ফর্ম্যাট: কোঁকড়ানো-বন্ধনীগুলি = 2517 মিলিসেকেন্ড

আমার উপসংহার:
আমি উপরে যেমনটি হাইলাইট করেছি, স্ট্রিং.ফর্ম্যাটটি কোঁকড়ানো বন্ধনীর সাথে ব্যবহার করা ভাল পঠনযোগ্যতা এবং পারফরম্যান্সের সুবিধা পেতে ভাল পছন্দ হওয়া উচিত।


0

আপনি স্ট্রিং কনক্যাটেনেশন এবং স্ট্রিং তুলনা করতে পারবেন না। উপরের প্রোগ্রাম দ্বারা ফরম্যাট।

আপনি নীচের মত আপনার কোড ব্লকে স্ট্রিং.ফর্ম্যাট এবং সংমিশ্রণটি ব্যবহার করার অবস্থানটিও আন্তর্জাত করার চেষ্টা করতে পারেন For

public static void main(String[] args) throws Exception {      
  long start = System.currentTimeMillis();

  for( int i=0;i<1000000; i++){
    String s = String.format( "Hi %s; Hi to you %s",i, + i*2);
  }

  long end = System.currentTimeMillis();
  System.out.println("Format = " + ((end - start)) + " millisecond");
  start = System.currentTimeMillis();

  for( int i=0;i<1000000; i++){
    String s = "Hi " + i + "; Hi to you " + i*2;
  }

  end = System.currentTimeMillis();
  System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;
}

ফর্ম্যাটটি এখানে দ্রুত কাজ করে তা দেখে আপনি অবাক হয়ে যাবেন। এটি যেহেতু তৈরি অন্তর্নির্মিত অবজেক্টগুলি প্রকাশ না হতে পারে এবং মেমরির বরাদ্দ এবং এর ফলে কর্মক্ষমতা নিয়ে কোনও সমস্যা হতে পারে।


3
আপনি কি আপনার কোড চেষ্টা করেছেন? কনকনাটেশন সবসময় দশবার দ্রুত
Icaro

এই "সিস্টেম.কারেন্টটাইমমিলিস ()" চালানোর জন্য নেওয়া মিলিস সম্পর্কে কী: পি।
রেহান

0

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

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