রুবিতে একক উদ্ধৃতি বনাম ডাবল কোট ব্যবহার করার কি পারফরম্যান্স লাভ রয়েছে?


126

আপনি কি জানেন যে রুবিতে একক কোটের পরিবর্তে ডাবল কোট ব্যবহার করা রুবি ১.৮ এবং ১.৯ এ কোনও অর্থবহ উপায়ে কর্মক্ষমতা হ্রাস করে?

সুতরাং আমি টাইপ যদি

question = 'my question'

এটা কি তুলনায় দ্রুত

question = "my question"

আমি কল্পনা করেছি যে রুবি যখন ডাবল কোটসের মুখোমুখি হয় এবং সম্ভবত এটি করতে কিছু চক্র ব্যয় করে তখন কোনও কিছুর মূল্যায়ন করা দরকার কিনা তা বোঝার চেষ্টা করে।


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

60
কেন এত লোক আশা করে যে রুবি কেবলমাত্র ওয়েব প্রোগ্রামিংয়ের জন্য ব্যবহৃত হবে?
জোহনেস

17
আমি এই অকাল অপটিমাইজেশন বিবেচনা করব না। আপনার অ্যাপ্লিকেশনটি সম্পূর্ণ হয়ে যাওয়ার পরে ফিরে যাওয়ার এবং একক বা দ্বিগুণ উভয়ের জন্য অনুকূলকরণ করা একটি বড় মাথাব্যথা হতে পারে।
ওমর

7
আমার জন্য এটি কেবল স্টাইল: আমি অন্যান্য ক্ষেত্রে 'স্ট্যাটিক' স্ট্রিং এবং ডাবল কউউটিস (বা অন্যান্য ইন্টারপোল্টেড স্ট্রিং) এর জন্য একক উদ্ধৃতি ব্যবহার করি।
স্পর্শ

3
@ বাডি: আপনি যদি অস্তিত্বহীন কোনও সমস্যা অপসারণ করে থাকেন তবে এটি অকালীন অপ্টিমাইজেশন।
অ্যান্ডি লেস্টার

উত্তর:


86
$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.0.0]

$ cat benchmark_quotes.rb
# As of Ruby 1.9 Benchmark must be required
require 'benchmark'

n = 1000000
Benchmark.bm(15) do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
end

$ ruby benchmark_quotes.rb 

                      user     system      total        real
assign single     0.110000   0.000000   0.110000 (  0.116867)
assign double     0.120000   0.000000   0.120000 (  0.116761)
concat single     0.280000   0.000000   0.280000 (  0.276964)
concat double     0.270000   0.000000   0.270000 (  0.278146)

দ্রষ্টব্য: আমি এটি নতুন রুবি সংস্করণগুলির সাথে কাজ করার জন্য এবং আপডেট শিরোনামটি পরিষ্কার করতে এবং দ্রুত সিস্টেমে বেঞ্চমার্ক চালানোর জন্য এটি আপডেট করেছি।

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


আমি কি ফলাফলগুলি সঠিকভাবে ব্যাখ্যা করছি? ডাবল কোট ব্যবহার করে অ্যাসাইনমেন্ট আসলে এককটির চেয়ে দ্রুত? এটা কিভাবে হতে পারে?
এলোমেলোভাবে

দৃশ্যত হ্যাঁ, যদিও পার্থক্যটি সামান্য। কেন - আমাকে মারধর করে।
জেটেটিক

এই বেঞ্চমার্কটি যদি সংকলনের সময় এবং মৃত্যুদণ্ডের সময় বিবেচনা করে তবে তা অনেক বেশি বাধ্য হয়ে উঠবে।
নোহাত

9
মাপা পার্থক্যগুলি অর্থবহ নয়। কেবল অর্ডার (আবর্জনা সংগ্রহের কারণে) গুরুত্বপূর্ণ পার্থক্য আনতে পারে। এর মধ্যে কোনও রানটাইম পার্থক্য নেই 'এবং "সেগুলি একই জিনিসকে পার্স করা হয়।
মার্ক-আন্দ্রে লাফোর্টুন

104

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

বিবরণ:

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

গুরুত্বপূর্ণ বিষয়টি হ'ল যখন মৃত্যুদন্ড কার্যকর করা হবে ঠিক একই রকম হবে

বেঞ্চমার্কিং এ কেবল রুবি কীভাবে কাজ করে তা বোঝার অভাব দেখায়। উভয় ক্ষেত্রেই স্ট্রিংগুলি একটিতে পার্স করা হবে tSTRING_CONTENT( উত্সটিparse.y দেখুন )। অন্য কথায়, সিপিইউ তৈরি করার সময় 'string'বা ঠিক একই ক্রিয়াকলাপটি অতিক্রম করবে "string"। সঠিক একই বিট হুবহু একইভাবে ফ্লিপ করবে। বেঞ্চমার্কিং কেবল তাত্পর্য প্রদর্শন করবে যা উল্লেখযোগ্য নয় এবং অন্যান্য কারণগুলির কারণে (জিসি লাথি মারছে, ইত্যাদি); মনে রাখবেন, এই ক্ষেত্রে কোনও পার্থক্য থাকতে পারে না! এগুলির মতো মাইক্রো মানদণ্ডগুলি সঠিকভাবে পাওয়া কঠিন। fruityএই জন্য একটি শালীন সরঞ্জাম জন্য আমার মণি দেখুন ।

মনে রাখবেন যদি সেখানে ফর্মের ক্ষেপক হয় "...#{...}...", এই একটি বিশ্লেষণ পরার tSTRING_DBEG, একটি গুচ্ছ tSTRING_DVARপ্রতিটি প্রকাশের জন্য #{...}এবং একটি চূড়ান্ত tSTRING_DEND। এটি কেবল তখনই অন্তরায় রয়েছে, যা ওপি সম্পর্কে যা তা নয়।

আমি আপনাকে সর্বত্র ডাবল কোট ব্যবহার করার পরামর্শ দিয়েছিলাম ( #{some_var}পরে এটি যুক্ত করা আরও সহজ করে তোলে ) তবে আমি এখন একক উদ্ধৃতি ব্যবহার করি যদি না আমার প্রক্ষিপ্তকরণ \nইত্যাদির প্রয়োজন হয় ... তবে আমি এটি দৃশ্যত পছন্দ করি এবং এটি কিছুটা স্পষ্ট হয়, যেহেতু কিছুই নেই এতে কোনও এক্সপ্রেশন রয়েছে কিনা তা দেখার জন্য স্ট্রিংকে বিশ্লেষণ করতে হবে।


3
মিনিট পারফরম্যান্স পার্থক্য যে আরও অনেক গুরুত্বপূর্ণ মনে হয়। ডাবল কোট!
ভেঙ্কট ডি

আপনার উত্তর আমাকে নির্দেশ করার জন্য ধন্যবাদ। আপনি কেন স্পষ্ট করে বলতে পারবেন যে আপনি কেন বলছেন যে বেঞ্চমার্কিং এটি বিভ্রান্তিকর? আমি সম্মত হই যে পার্থক্যগুলি সম্ভবত উপেক্ষিত কিন্তু কোনওভাবে বেঞ্চমার্কটি কী ভুল? (কেউ ইতিমধ্যে হাইলাইট করেছেন #{n}যে সংখ্যার রূপান্তরটি করবে)। এটি কি পার্সিংয়ের মধ্যে পার্থক্য দেখাচ্ছে না ?.
ফিলিটি

1
শৈলী নির্দেশিকা লিঙ্ক করার জন্য ধন্যবাদ। বিশ্বাস করতে পারছি না আমি এর আগে পারিনি।
ফিল্ট

1
আপনার উত্তরে উল্লিখিত স্টাইল গাইডটি একক বা ডাবল উক্তিগুলি একটি সামঞ্জস্যপূর্ণ শৈলী গ্রহণের পরামর্শ দেওয়ার জন্য আপডেট করা হয়েছে এবং এটি নির্দেশ করে যে রুবি সম্প্রদায়ের মধ্যে ডাবল উদ্ধৃতিযুক্ত স্ট্রিং বেশি প্রচলিত।
ফিল্টার 18

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

35

কনটেনটেশন বনাম ইন্টারপোলেশন পরিমাপ করার জন্য কেউই ঘটেনি:

$ ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.6.2]
$ cat benchmark_quotes.rb
require 'benchmark'
n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("assign interp") { n.times do; c = "a string #{'b string'}"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
end

$ ruby -w benchmark_quotes.rb 
      user     system      total        real
assign single  2.600000   1.060000   3.660000 (  3.720909)
assign double  2.590000   1.050000   3.640000 (  3.675082)
assign interp  2.620000   1.050000   3.670000 (  3.704218)
concat single  3.760000   1.080000   4.840000 (  4.888394)
concat double  3.700000   1.070000   4.770000 (  4.818794)

বিশেষ করে, মনে রাখবেন assign interp = 2.62বনাম concat single = 3.76। পিষ্টক হিসাবে আইসিং হিসাবে, আমি 'a' + var + 'b'স্পেস সম্পর্কে বিশেষত স্থানের তুলনায় আরও পঠনযোগ্য হতে পারে অন্তরঙ্গন।


+1 টি। এটিই একমাত্র দ্বিখণ্ডিত বেঞ্চমার্ক যা আপেলের সাথে আপেলের তুলনা করে।
মার্ক টমাস

1
বেঞ্চমার্কিং বিভ্রান্তিকর হতে পারে; কেন আমার উত্তর দেখুন। সংক্ষিপ্তকরণ এবং অন্তরঙ্গকরণের মধ্যে তুলনা করার জন্য, এটি স্পষ্ট হওয়া উচিত যে অন্তরঙ্গকরণ সংক্ষিপ্তকরণের চেয়ে ধীর হতে পারে না। যে কোনও ক্ষেত্রে, এটি আসলে প্রশ্নের অংশ নয়!
মার্ক-আন্দ্রে লাফোর্টুন

আপনি কি এই পরীক্ষায় << যুক্ত করতে পারবেন?
নিক

16

কোনও পার্থক্য নেই - যদি না আপনি #{some_var}স্টাইলের স্ট্রিং ইন্টারপোলেশন ব্যবহার করেন । তবে আপনি যদি কেবল এটি সম্পাদন করেন তবেই আপনি পারফরম্যান্সের হিট পাবেন।

জেটেটিকের উদাহরণ থেকে পরিবর্তিত :

require 'benchmark'
n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("assign interp") { n.times do; c = "a #{n} string"; end}  
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
  x.report("concat interp") { n.times do; "a #{n} string " + "b #{n} string"; end}
end

আউটপুট

               user       system     total    real
assign single  0.370000   0.000000   0.370000 (  0.374599)
assign double  0.360000   0.000000   0.360000 (  0.366636)
assign interp  1.540000   0.010000   1.550000 (  1.577638)
concat single  1.100000   0.010000   1.110000 (  1.119720)
concat double  1.090000   0.000000   1.090000 (  1.116240)
concat interp  3.460000   0.020000   3.480000 (  3.535724)

মজাদার. ইন্টারপোলেশন দেখতে কিছুটা বেশি ব্যয়বহুল। এটি কি 1.8? 1.9- তে কিছু পরিবর্তন হয় কিনা তা দেখে ভাল লাগবে।
zetetic

জেটেটিক - হ্যাঁ এটি রুবির বিরুদ্ধে ছিল 1.8.7
ম্যাড্লেপ

1
ইন্টারপ ভার্সন উভয়ই ইন্টারপোলটিং এবং কনটেনেটেটিং প্লাস একটি সংখ্যাকে দুটি স্ট্রিংয়ে রূপান্তরিত করে। ফলাফলগুলি একই তৈরি করলে ইন্টারপোলেশন জিতবে। Gist.github.com/810463 দেখুন । আসল গ্রহণযোগ্যতা হল একক বা ডাবল উদ্ধৃতিগুলির চেয়ে টো_স সম্পর্কে বেশি চিন্তা করা worry
ব্রায়ান ডিটারলিং

এটি বেঞ্চমার্কিং কেবল বিভ্রান্তিমূলক হতে পারে এবং রুবি কীভাবে কাজ করে তার একটি ভুল বোঝাবুঝি দেখায়। আমার উত্তর দেখুন।
মার্ক-আন্দ্রে লাফোর্টুন

13

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

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

আসল ইন্টারপোলেশন অবশ্যই একটি আলাদা গল্প। 'foo'তুলনায় প্রায় 1 সেকেন্ড দ্রুত হবে "#{sleep 1; nil}foo"


4
+1 উল্লেখ করার জন্য যে ব্যয়টি রান সময় নয় সংকলিত সময়ে হয়, সুতরাং উপরের উচ্চ-ভোট প্রাপ্ত বেঞ্চমার্ক-ভিত্তিক উত্তরগুলি বিভ্রান্তিকর।
নোট

"এটি একটি পার্স-টাইম ব্যয়, রান-টাইম ব্যয় নয়" " মূল বাক্যাংশ।
টিন ম্যান

9

একক উদ্ধৃতিগুলির চেয়ে দ্বিগুণ উদ্ধৃতি টাইপ করতে দ্বিগুণ মূল স্ট্রাইক গ্রহণ করে। আমি সবসময়ই তাড়াহুড়ো করে থাকি। আমি একক উদ্ধৃতি ব্যবহার করি। :) এবং হ্যাঁ, আমি এটি "পারফরম্যান্স লাভ" হিসাবে বিবেচনা করি। :)


কেন ডাবল কোটগুলি 2x মূল স্ট্রাইক নেবে? তারা উভয়ই একটি একক কী দ্বারা উপস্থাপিত হয়। অতিরিক্তভাবে, অনেক আইডিই স্বয়ংক্রিয়ভাবে ক্লোজিং কোট যুক্ত করে add
ম্যাট ড্রেসেল

3
আইডিই স্বয়ংক্রিয়ভাবে উদ্ধৃতিটি বন্ধ করে দিলেও, ডাবল উদ্ধৃতিগুলিতে এখনও 100% আরও কী স্ট্রাইক প্রয়োজন। ;-)
ক্লিন্ট পাচল

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

1
কখনও কখনও আমি অলসতার বাইরে এই পরামর্শটি অনুসরণ করি। তবে দুর্ভাগ্যক্রমে অন্য কয়েকটি ভাষায় এটি বিপরীত (যেমন একক উদ্ধৃতিতে শিফট + কিছু দরকার হয় যখন ডাবল উদ্ধৃতিগুলি একক কীস্ট্রোক হয়)। দুর্ভাগ্যজনক কারণ কারণ দুটি ভিন্ন কীবোর্ড লেআউটযুক্ত লোক একই প্রকল্পে কাজ করে, তাদের মধ্যে একটির জন্য কিছু কীস্ট্রোক ত্যাগ করতে হবে :)
হালিল Özgür

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

8

ভেবেছিলাম আমি একটি তুলনা যোগ করব 1.8.7 এবং 1.9.2। আমি তাদের কয়েকবার দৌড়েছি। ভেরিয়েন্সটি প্রায় + -0.01 ছিল।

require 'benchmark'
n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("assign interp") { n.times do; c = "a #{n} string"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
  x.report("concat interp") { n.times do; "a #{n} string " + "b #{n} string"; end}
end

রুবি 1.8.7 (2010-08-16 প্যাচলেভেল 302) [x86_64-লিনাক্স]

assign single  0.180000   0.000000   0.180000 (  0.187233)
assign double  0.180000   0.000000   0.180000 (  0.187566)
assign interp  0.880000   0.000000   0.880000 (  0.877584)
concat single  0.550000   0.020000   0.570000 (  0.567285)
concat double  0.570000   0.000000   0.570000 (  0.570644)
concat interp  1.800000   0.010000   1.810000 (  1.816955)

রুবি 1.9.2p0 (2010-08-18 রিভিশন 29036) [x86_64-লিনাক্স]

  user          system      total      real
assign single  0.140000   0.000000   0.140000 (  0.144076)
assign double  0.130000   0.000000   0.130000 (  0.142316)
assign interp  0.650000   0.000000   0.650000 (  0.656088)
concat single  0.370000   0.000000   0.370000 (  0.370663)
concat double  0.370000   0.000000   0.370000 (  0.370076)
concat interp  1.420000   0.000000   1.420000 (  1.412210)

ইন্টারপকে স্ট্রিং রূপান্তর করতে নম্বর করতে হচ্ছে। Gist.github.com/810463 দেখুন ।
ব্রায়ান ডিটারলিং

আপনি এই নম্বরগুলি কেন পান সে সম্পর্কে আমার উত্তর দেখুন ।
মার্ক-আন্দ্রে লাফোর্টুন

ইন্টারপ ভাল পয়েন্ট। আমি আমার পূর্বের উত্তরটি কেবল একটি ভিত্তি হিসাবে অনুলিপি করেছি। ও আমাকে শিখিয়ে দেবে।
ফিল্ট

3

উভয় দিকের মধ্যে কোনও উল্লেখযোগ্য পার্থক্য নেই। এটি গুরুত্বপূর্ণ হিসাবে এটি বিশাল হতে হবে।

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

মেশিন সময় ব্যয় খুব সামান্য। কোড লেখার এবং এটি বজায় রাখতে প্রোগ্রামার সময়ের ব্যয় বিশাল।

কয়েক হাজার রানের চেয়ে কয়েক মিনিটের রানটাইম সেকেন্ড বাঁচানোর জন্য একটি অপ্টিমাইজেশন কী ভাল যদি এর অর্থ হয় যে কোডটি বজায় রাখা আরও কঠিন?

একটি শৈলীর সাথে বাছাই করুন এবং এটির সাথে স্টিক করুন তবে রানটাইমের পরিসংখ্যানগতভাবে তুচ্ছ মিলিসেকেন্ডের ভিত্তিতে স্টাইলটি চয়ন করবেন না


1

আমিও ভেবেছিলাম যে একক উদ্ধৃত স্ট্রিংগুলি রুবির পক্ষে পার্স করার পক্ষে আরও দ্রুত। এটা মনে হয় না।

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

generate.rb: 
10000.times do
  ('a'..'z').to_a.each {|v| print "#{v}='This is a test string.'\n" }
end

#Generate sample ruby code with lots of strings to parse
$ ruby generate.rb > single_q.rb
#Get the double quote version
$ tr \' \" < single_q.rb > double_q.rb

#Compare execution times
$ time ruby single_q.rb 

real    0m0.978s
user    0m0.920s
sys     0m0.048s
$ time ruby double_q.rb 

real    0m0.994s
user    0m0.940s
sys     0m0.044s

বারবার রান করা খুব বেশি পার্থক্য বলে মনে হচ্ছে না। স্ট্রিংয়ের যে কোনও সংস্করণ পার্স করতে এখনও একই সময় লাগে।


0

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

টেবিল ভিত্তিক স্ক্যানারটিতে রূপান্তর নির্ধারণের জন্য একক দর্শন হতে চলেছে এবং প্রতিটি চরিত্রের জন্যই তা ঘটবে।

যখন পার্সার স্ক্যানার আউটপুট পায়, এটি ইতিমধ্যে জানা গেছে যে এটির ব্লক কোডটি প্রকাশ করতে হবে। সুতরাং # {} ব্লকটি হ্যান্ডেল করার জন্য স্ক্যানার / পার্সারে মেমরির ওভারহেড কেবল ওভারহেড হয়, যা আপনি যে কোনও উপায়েই প্রদান করেন।

যদি না আমি কিছু (বা সংকলক নির্মাণের বিবরণ মিসরুমারিং) মিস করছি তবে এটি অবশ্যই সম্ভব) :)


0
~ > ruby -v   
jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_37) [darwin-x86_64-java]
~ > cat qu.rb 
require 'benchmark'

n = 1000000
Benchmark.bm do |x|
  x.report("assign single") { n.times do; c = 'a string'; end}
  x.report("assign double") { n.times do; c = "a string"; end}
  x.report("concat single") { n.times do; 'a string ' + 'b string'; end}
  x.report("concat double") { n.times do; "a string " + "b string"; end}
end
~ > ruby qu.rb
      user     system      total        real
assign single  0.186000   0.000000   0.186000 (  0.151000)
assign double  0.062000   0.000000   0.062000 (  0.062000)
concat single  0.156000   0.000000   0.156000 (  0.156000)
concat double  0.124000   0.000000   0.124000 (  0.124000)

0

আপনারা সবাই মিস করেছেন।

এখানে ডক

এটা চেষ্টা কর

require 'benchmark'
mark = <<EOS
a string
EOS
n = 1000000
Benchmark.bm do |x|
  x.report("assign here doc") {n.times do;  mark; end}
end

এটা আমাকে দিয়েছে

`asign here doc  0.141000   0.000000   0.141000 (  0.140625)`

এবং

'concat single quotes  1.813000   0.000000   1.813000 (  1.843750)'
'concat double quotes  1.812000   0.000000   1.812000 (  1.828125)'

সুতরাং এটি অবশ্যই কনক্যাট এবং এই সমস্ত পুস্তকে লেখার চেয়ে ভাল।

আমি দেখতে চাই রুবি একটি নথির ম্যানিপুলেশন ভাষার লাইনে আরও শিখিয়েছে।

সর্বোপরি, আমরা কি সত্যই তা কি রেলস, সিনট্রা এবং চলমান পরীক্ষাগুলিতে করি না?


0

আমি টিম স্নোহাইটের উত্তরটি মোডে করেছিলাম।

require 'benchmark'
n = 1000000
attr_accessor = :a_str_single, :b_str_single, :a_str_double, :b_str_double
@a_str_single = 'a string'
@b_str_single = 'b string'
@a_str_double = "a string"
@b_str_double = "b string"
@did_print = false
def reset!
    @a_str_single = 'a string'
    @b_str_single = 'b string'
    @a_str_double = "a string"
    @b_str_double = "b string"
end
Benchmark.bm do |x|
    x.report('assign single       ') { n.times do; c = 'a string'; end}
    x.report('assign via << single') { c =''; n.times do; c << 'a string'; end}
    x.report('assign double       ') { n.times do; c = "a string"; end}
    x.report('assing interp       ') { n.times do; c = "a string #{'b string'}"; end}
    x.report('concat single       ') { n.times do; 'a string ' + 'b string'; end}
    x.report('concat double       ') { n.times do; "a string " + "b string"; end}
    x.report('concat single interp') { n.times do; "#{@a_str_single}#{@b_str_single}"; end}
    x.report('concat single <<    ') { n.times do; @a_str_single << @b_str_single; end}
    reset!
    # unless @did_print
    #   @did_print = true
    #   puts @a_str_single.length 
    #   puts " a_str_single: #{@a_str_single} , b_str_single: #{@b_str_single} !!"
    # end
    x.report('concat double interp') { n.times do; "#{@a_str_double}#{@b_str_double}"; end}
    x.report('concat double <<    ') { n.times do; @a_str_double << @b_str_double; end}
end

ফলাফল:

jruby 1.7.4 (1.9.3p392) 2013-05-16 2390d3b on Java HotSpot(TM) 64-Bit Server VM 1.7.0_10-b18 [darwin-x86_64]
       user     system      total        real
assign single         0.220000   0.010000   0.230000 (  0.108000)
assign via << single  0.280000   0.010000   0.290000 (  0.138000)
assign double         0.050000   0.000000   0.050000 (  0.047000)
assing interp         0.100000   0.010000   0.110000 (  0.056000)
concat single         0.230000   0.010000   0.240000 (  0.159000)
concat double         0.150000   0.010000   0.160000 (  0.101000)
concat single interp  0.170000   0.000000   0.170000 (  0.121000)
concat single <<      0.100000   0.000000   0.100000 (  0.076000)
concat double interp  0.160000   0.000000   0.160000 (  0.108000)
concat double <<      0.100000   0.000000   0.100000 (  0.074000)

ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-darwin12.4.0]
       user     system      total        real
assign single         0.100000   0.000000   0.100000 (  0.103326)
assign via << single  0.160000   0.000000   0.160000 (  0.163442)
assign double         0.100000   0.000000   0.100000 (  0.102212)
assing interp         0.110000   0.000000   0.110000 (  0.104671)
concat single         0.240000   0.000000   0.240000 (  0.242592)
concat double         0.250000   0.000000   0.250000 (  0.244666)
concat single interp  0.180000   0.000000   0.180000 (  0.182263)
concat single <<      0.120000   0.000000   0.120000 (  0.126582)
concat double interp  0.180000   0.000000   0.180000 (  0.181035)
concat double <<      0.130000   0.010000   0.140000 (  0.128731)

0

আমি নিম্নলিখিত চেষ্টা করেছিলাম:

def measure(t)
  single_measures = []
  double_measures = []
  double_quoted_string = ""
  single_quoted_string = ''
  single_quoted = 0
  double_quoted = 0

  t.times do |i|
    t1 = Time.now
    single_quoted_string << 'a'
    t1 = Time.now - t1
    single_measures << t1

    t2 = Time.now
    double_quoted_string << "a"
    t2 = Time.now - t2
    double_measures << t2

    if t1 > t2 
      single_quoted += 1
    else
      double_quoted += 1
    end
  end
  puts "Single quoted did took longer in #{((single_quoted.to_f/t.to_f) * 100).round(2)} percent of the cases"
  puts "Double quoted did took longer in #{((double_quoted.to_f/t.to_f) * 100).round(2)} percent of the cases"

  single_measures_avg = single_measures.inject{ |sum, el| sum + el }.to_f / t
  double_measures_avg = double_measures.inject{ |sum, el| sum + el }.to_f / t
  puts "Single did took an average of #{single_measures_avg} seconds"
  puts "Double did took an average of #{double_measures_avg} seconds"
    puts "\n"
end
both = 10.times do |i|
  measure(1000000)
end

এবং এগুলি আউটপুটগুলি:

1।

Single quoted did took longer in 32.33 percent of the cases
Double quoted did took longer in 67.67 percent of the cases
Single did took an average of 5.032084099982639e-07 seconds
Double did took an average of 5.171539549983464e-07 seconds

2।

Single quoted did took longer in 26.9 percent of the cases
Double quoted did took longer in 73.1 percent of the cases
Single did took an average of 4.998066229983696e-07 seconds
Double did took an average of 5.223457359986066e-07 seconds

3।

Single quoted did took longer in 26.44 percent of the cases
Double quoted did took longer in 73.56 percent of the cases
Single did took an average of 4.97640888998877e-07 seconds
Double did took an average of 5.132918459987151e-07 seconds

4।

Single quoted did took longer in 26.57 percent of the cases
Double quoted did took longer in 73.43 percent of the cases
Single did took an average of 5.017136069985988e-07 seconds
Double did took an average of 5.004514459988143e-07 seconds

5।

Single quoted did took longer in 26.03 percent of the cases
Double quoted did took longer in 73.97 percent of the cases
Single did took an average of 5.059069689983285e-07 seconds
Double did took an average of 5.028807639983705e-07 seconds

6।

Single quoted did took longer in 25.78 percent of the cases
Double quoted did took longer in 74.22 percent of the cases
Single did took an average of 5.107472039991399e-07 seconds
Double did took an average of 5.216212339990241e-07 seconds

7।

Single quoted did took longer in 26.48 percent of the cases
Double quoted did took longer in 73.52 percent of the cases
Single did took an average of 5.082368429989468e-07 seconds
Double did took an average of 5.076817109989933e-07 seconds

8।

Single quoted did took longer in 25.97 percent of the cases
Double quoted did took longer in 74.03 percent of the cases
Single did took an average of 5.077162969990005e-07 seconds
Double did took an average of 5.108381859991112e-07 seconds

9।

Single quoted did took longer in 26.28 percent of the cases
Double quoted did took longer in 73.72 percent of the cases
Single did took an average of 5.148080479983138e-07 seconds
Double did took an average of 5.165793929982176e-07 seconds

10।

Single quoted did took longer in 25.03 percent of the cases
Double quoted did took longer in 74.97 percent of the cases
Single did took an average of 5.227828659989748e-07 seconds
Double did took an average of 5.218296609988378e-07 seconds

যদি আমি কোনও ভুল না করি তবে আমার কাছে মনে হয় যে উভয়ই প্রায় একই সময় নেয়, যদিও একক উদ্ধৃতি বেশিরভাগ ক্ষেত্রে সামান্য দ্রুত হয়।

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