গ্রোভির সাথে স্ট্রিং কনকনেটেশন


91

গ্রোভির স্ট্রিংগুলি সংঘবদ্ধ করার সর্বোত্তম (idiomatic) উপায় কী?

বিকল্প 1:

calculateAccountNumber(bank, branch, checkDigit, account) {
    bank + branch + checkDigit + account
}

বিকল্প 2:

calculateAccountNumber(bank, branch, checkDigit, account) {
    "$bank$branch$checkDigit$account"
}

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

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

উত্তর:


122

আমি সর্বদা দ্বিতীয় পদ্ধতিতে (জি স্ট্রিং টেম্পলেট ব্যবহার করে) যাই, যদিও আপনার মতো প্যারামিটারের বেশি যখন থাকে তখন আমি এগুলিকে গুটিয়ে ফেলার চেষ্টা ${X}করি যেহেতু এটি আরও পাঠযোগ্য।

এই পদ্ধতিগুলিতে কিছু বেঞ্চমার্ক চালানো ( নাগাই মাসাটো'র দুর্দান্ত জিবেঞ্চ মডিউল ব্যবহার করে ) এছাড়াও দেখায় যে অন্যান্য পদ্ধতির তুলনায় টেম্প্লেটিং দ্রুততর হয়:

@Grab( 'com.googlecode.gbench:gbench:0.3.0-groovy-2.0' )
import gbench.*

def (foo,bar,baz) = [ 'foo', 'bar', 'baz' ]
new BenchmarkBuilder().run( measureCpuTime:false ) {
  // Just add the strings
  'String adder' {
    foo + bar + baz
  }
  // Templating
  'GString template' {
    "$foo$bar$baz"
  }
  // I find this more readable
  'Readable GString template' {
    "${foo}${bar}${baz}"
  }
  // StringBuilder
  'StringBuilder' {
    new StringBuilder().append( foo )
                       .append( bar )
                       .append( baz )
                       .toString()
  }
  'StringBuffer' {
    new StringBuffer().append( foo )
                      .append( bar )
                      .append( baz )
                      .toString()
  }
}.prettyPrint()

এটি আমার মেশিনে আমাকে নিম্নলিখিত ফলাফল দেয়:

Environment
===========
* Groovy: 2.0.0
* JVM: Java HotSpot(TM) 64-Bit Server VM (20.6-b01-415, Apple Inc.)
    * JRE: 1.6.0_31
    * Total Memory: 81.0625 MB
    * Maximum Memory: 123.9375 MB
* OS: Mac OS X (10.6.8, x86_64) 

Options
=======
* Warm Up: Auto 
* CPU Time Measurement: Off

String adder               539
GString template           245
Readable GString template  244
StringBuilder              318
StringBuffer               370

এর পক্ষে পাঠযোগ্যতা এবং গতির সাথে, আমি টেম্পলেট দেওয়ার প্রস্তাব দেব ;-)

বিশেষ দ্রষ্টব্য: আপনি যুক্ত করে থাকেন toString()আউটপুট অন্যান্য মেট্রিকের মত একই ধরনের করতে GString পদ্ধতি শেষে, এবং এটি একটি উত্তম পরীক্ষা করতে, StringBuilderএবং StringBufferবীট গতির জন্য GString পদ্ধতি। তবে যেহেতু বেশিরভাগ জিনিসের জন্য জিস্ট্রিং স্ট্রিংয়ের জায়গায় ব্যবহার করা যেতে পারে (আপনাকে কেবল মানচিত্র কী এবং এসকিউএল বিবৃতি দিয়ে সতর্কতা অবলম্বন করা উচিত), বেশিরভাগ ক্ষেত্রে এটি চূড়ান্ত রূপান্তর ছাড়াই ছেড়ে যেতে পারে

এই পরীক্ষাগুলি যুক্ত করা (যেমন এটি মন্তব্যে জিজ্ঞাসা করা হয়েছে)

  'GString template toString' {
    "$foo$bar$baz".toString()
  }
  'Readable GString template toString' {
    "${foo}${bar}${baz}".toString()
  }

এখন আমরা ফলাফলগুলি পেয়েছি:

String adder                        514
GString template                    267
Readable GString template           269
GString template toString           478
Readable GString template toString  480
StringBuilder                       321
StringBuffer                        369

সুতরাং আপনি যেমন দেখতে পাচ্ছেন (যেমন আমি বলেছি), এটি স্ট্রিংবিল্ডার বা স্ট্রিংবুফারের চেয়ে ধীরে ধীরে তবে স্ট্রিংস যুক্ত করার চেয়ে কিছুটা দ্রুত ...

তবে এখনও অনেক বেশি পাঠযোগ্য।

নীচে গ্রামীণ কোডার দ্বারা মন্তব্য করার পরে সম্পাদনা করুন

সর্বশেষ জিবেঞ্চে আপডেট হয়েছে, সংক্ষিপ্তকরণের জন্য বৃহত্তর স্ট্রিং এবং স্ট্রিংবিল্ডারের সাথে একটি পরীক্ষা ভাল আকারে শুরু করা:

@Grab( 'org.gperfutils:gbench:0.4.2-groovy-2.1' )

def (foo,bar,baz) = [ 'foo' * 50, 'bar' * 50, 'baz' * 50 ]
benchmark {
  // Just add the strings
  'String adder' {
    foo + bar + baz
  }
  // Templating
  'GString template' {
    "$foo$bar$baz"
  }
  // I find this more readable
  'Readable GString template' {
    "${foo}${bar}${baz}"
  }
  'GString template toString' {
    "$foo$bar$baz".toString()
  }
  'Readable GString template toString' {
    "${foo}${bar}${baz}".toString()
  }
  // StringBuilder
  'StringBuilder' {
    new StringBuilder().append( foo )
                       .append( bar )
                       .append( baz )
                       .toString()
  }
  'StringBuffer' {
    new StringBuffer().append( foo )
                      .append( bar )
                      .append( baz )
                      .toString()
  }
  'StringBuffer with Allocation' {
    new StringBuffer( 512 ).append( foo )
                      .append( bar )
                      .append( baz )
                      .toString()
  }
}.prettyPrint()

দেয়

Environment
===========
* Groovy: 2.1.6
* JVM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01, Oracle Corporation)
    * JRE: 1.7.0_21
    * Total Memory: 467.375 MB
    * Maximum Memory: 1077.375 MB
* OS: Mac OS X (10.8.4, x86_64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

                                    user  system  cpu  real

String adder                         630       0  630   647
GString template                      29       0   29    31
Readable GString template             32       0   32    33
GString template toString            429       0  429   443
Readable GString template toString   428       1  429   441
StringBuilder                        383       1  384   396
StringBuffer                         395       1  396   409
StringBuffer with Allocation         277       0  277   286

4
আমি সুসংগঠনের জন্য জিস্ট্রিং টেম্পলেট ব্যবহারের সাথে একমত নই, তবে আপনাকে .toString()দুটি জিস্ট্রিং পরীক্ষায় যুক্ত করে পুনরায় পরীক্ষা করা উচিত। আমার রান দেখায় যে তারা তখন প্রায় একই রকম সম্পাদন করে String adder। আমার অনুমান যে আপনি যে পরীক্ষাটি চালিয়েছেন তা প্রকৃতপক্ষে সংক্ষেপণ পরিচালনা করে না, সুতরাং এটি কেবল একটি জিস্ট্রিং অবজেক্ট তৈরি করে রেফারেন্সগুলি সঞ্চয় করে। StringBuilderযদি আপনার Stringকোনও পর্যায়ে দরকার হয় তবে এটি দ্রুততম, নীচে হাত ।
অতি উত্সাহী

4
আমি কোনভাবেই দ্বিতীয়ার্ধ মিস করেছি! অবশ্যই, এমনকি যদি আপনি ছেড়ে GString"হিসাবে-হয়", এ কিছু বিন্দু এটি একটি সত্য রূপান্তরিত করা হয়েছে String, (এমনকি শুধু এটা প্রিন্ট আউট করতে), তাই সত্য সময়জ্ঞান গত সেট। শেষ সময়ে GStringটেমপ্লেটগুলির প্রবাহযোগ্যতা মারধর করে StringBuilderযখন সময়টি এই সমাপ্ত হয় , সুতরাং এটি চলমান। :-)
12

4
@ ওভারজিলিয়াস আহ, হ্যাঁ, বরাবরের মতোই এখানে মিথ্যা, জঘন্য মিথ্যা এবং মানদণ্ড রয়েছে ;-) পাঠযোগ্যতা এখানে আমার বোধ হয় এবং আমরা ইতিমধ্যে গ্রোভিকে ব্যবহার করছি, আমরা বলেছি যে খালি ধাতব কর্মক্ষমতা আমাদের প্রধান বিবেচনা নয়; -)
টিম_ইয়েটস

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

4
পরীক্ষা থেকে যা অনুপস্থিত তা হ'ল গণনা ক্ষমতা সহ স্ট্রিংবিল্ডার। কারণটি হ'ল foo + bar + baz এক বা দুটি বাফার প্রসারণ ঘটাবে যা সময়কে যুক্ত করে।
গ্রামীণকোডার

19
def my_string = "some string"
println "here: " + my_string 

উপরের উত্তরটি কেন বেঞ্চমার্ক, স্ট্রিং বাফার, পরীক্ষা ইত্যাদিতে যেতে হবে তা পুরোপুরি নিশ্চিত নয় Not


4
সরলতার জন্য উত্সাহ। আমার কেবল দুটি স্ট্রিং কনটেনেট করতে হবে। লোল
হার্পারভিল

2

বর্তমান হার্ডওয়্যারটিতে টাইম_ইটসের উত্তর পুনরুত্পাদন এবং অনুসন্ধানটি পরীক্ষা করতে লেফট শিফট () এবং কনক্যাট () পদ্ধতি যুক্ত করা হয়েছে:

  'String leftShift' {
    foo << bar << baz
  }
  'String concat' {
    foo.concat(bar)
       .concat(baz)
       .toString()
  }

ফলাফলটি খাঁটি স্ট্রিংয়ের দ্রুত সমাধান হিসাবে কনটাক্ট () দেখায়, তবে আপনি যদি জিস্ট্রিং অন্য কোথাও পরিচালনা করতে পারেন তবে জিস্ট্রিং টেমপ্লেটটি এখনও এগিয়ে রয়েছে, যদিও সম্মানজনক উল্লেখটি বামশিফ্ট () (বিটওয়াস অপারেটর) এবং স্ট্রিংবফার () এর সাথে প্রাথমিক হিসাবে যেতে হবে বরাদ্দ:

Environment
===========
* Groovy: 2.4.8
* JVM: OpenJDK 64-Bit Server VM (25.191-b12, Oracle Corporation)
    * JRE: 1.8.0_191
    * Total Memory: 238 MB
    * Maximum Memory: 3504 MB
* OS: Linux (4.19.13-300.fc29.x86_64, amd64)

Options
=======
* Warm Up: Auto (- 60 sec)
* CPU Time Measurement: On

                                    user  system  cpu  real

String adder                         453       7  460   469
String leftShift                     287       2  289   295
String concat                        169       1  170   173
GString template                      24       0   24    24
Readable GString template             32       0   32    32
GString template toString            400       0  400   406
Readable GString template toString   412       0  412   419
StringBuilder                        325       3  328   334
StringBuffer                         390       1  391   398
StringBuffer with Allocation         259       1  260   265
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.