কম্পিউটার টিউটোরিয়াল

রুবি স্ট্রিং ক্লিনিং স্পিড ১৩x ফাস্টার: প্রমাণিত টেকনিকlerle

যখন আপনার চিন্তা কোডে অনুবাদ করেন, সবচেয়ে সম্ভবত, আপনি সেই মেথডগুলো ব্যবহার করেন যেগুলো আপনার কাছে সবচেয়ে जाना-पহচান। এগুলো হলো সেই মেথডগুলো যা টপ অফ মাইন্ডে থাকে এবং অটোমেটিক্যালি হাত থেকে বের হয়: আপনি একটি স্ট্রিং দেখেন যেটি ক্লিন আপ করতে হবে এবং আপনার আঙ্গুলগুলো সেই মেথডগুলো টাইপ করে যেগুলো রেজাল্ট দেবে। প্রায়শই, যে মেথডগুলো আপনি অটোমেটিক্যালি টাইপ করেন সেগুলো সবচেয়ে জেনেরিক রুবি মেথডগুলো, কারণ সেগুলো আমরা অন্যদের চেয়ে বেশি পড়ি এবং লিখি, যেমন #gsub স্ট্রিং-এ ক্যারেক্টার সাবস্টিটিউট করার একটি জেনেরিক মেথড। কিন্তু, রুবির पास অফার করার জন্য আরও অনেক কিছু আছে, স্পেশালাইজড কনভেনিয়েন্স মেথডগুলো স্ট্যান্ডার্ড অপারেশনের জন্য। আমি রুবির সমৃদ্ধ ইডিয়মকে খুব পছন্দ করি-mostly কারণ এটি কোডকে আরও ইলিগ্যান্ট এবং পড়তে সহজ করে দেয়। আপনি যদি এই সমৃদ্ধতা থেকে সুবিধা নিতে চান, আমাদের এমনকি সিম্পলেস্ট পার্টস অফ কোড রিফ্যাক্টর করতে হবে—উদাহরণস্বরূপ, একটি স্ট্রিং ক্লিন আপ করা—এবং আমাদের ভোকাবুলারি এক্সপ্যান্ড করতে একটু’effort লাগে। প্রশ্ন হল: অতিরিক্ত effort টা ওয়ার্থ ইট?

স্পেস রিমুভ করার চারটি পথ

এখানে একটি স্ট্রিং আছে যেটি একটি ক্রেডিট কার্ড নম্বর রিপ্রেজেন্ট করে: "055 444 285"। এটার সাথে কাজ করতে, আমরা স্পেসগুলো রিমুভ করতে চাই। #gsub এটি করতে পারে; #gsub-এর সাথে আপনি যেকোনো কিছুর সাথে যেকোনো কিছুর সাবস্টিটিউট করতে পারেন। কিন্তু অন্যান্য অপশনও আছে।

string = "055 444 285" string.gsub(/ /, '') string.gsub(' ', '') string.tr(' ', '') string.delete(' ') # => "055444285"
এক্সপ্রেশনেস হলো যা আমি সবচেয়ে পছন্দ করি কনভেনিয়েন্স মেথডগুলোতে। লাস্টটি এর একটি ভালো উদাহরণ: "ডিলিট স্পেস"-এর চেয়ে আরও স্পষ্ট কিছু নেই। অপশনগুলোর মধ্যে ট্রেড-অফ চিন্তা করলে, রিডেবিলিটি আমার প্রথম প্রায়রিটি, যদি কোর্সে, এটি পারফরম্যান্স প্রব্লেম করে না। তাহলে দেখি আমার ফেভারিট সমাধান, #delete কতটুকু পেন কো করতে পারে। আমি উপরের উদাহরণগুলো বেঞ্চমার্ক করলাম। আপনি কোন মেথডটি সবচেয়ে ফাস্ট মনে করেন?
Benchmark.ips do |x| x.config(time: 30, warmup: 2) x.report('gsub') { string.gsub(/ /, '') } x.report('gsub, no regex') { string.gsub(' ', '') } x.report('tr') { string.tr(' ', '') } x.report('delete') { string.delete(' ') } x.compare! end
সর্বাধিক থেকে কম পারফরম্যান্ট ক্রম অনুমান করুন। রেজাল্ট দেখতে টগল খুলুন
Comparison: delete: 2326817.5 i/s tr: 2121629.8 i/s - 1.10x slower gsub, no regex: 868184.1 i/s - 2.68x slower gsub: 474970.5 i/s - 4.90x slower 
আমি অর্ডার সম্পর্কে আশ্চর্য ছিলাম না, কিন্তু স্পিডের পার্থক্যগুলো আমাকে আশ্চর্য চকিত করল। #gsub শুধু স্লোওয়ার নয়, এটি পাঠকের জন্য আর্গুমেন্টগুলো 'ডিকোড' করার এক্সট্রা effort দিয়ে নেয়। দেখি আরও কuch ক্লিন আপ করার সময় এই কমপেয়ারিজন কেমন হয়।

আপনার নম্বর বেছে নিন

নিচের ফোন নম্বরটি নিন: '(408) 974-2414'। ধরি আমাদের শুধু নিউমেরিক্যালস দরকার => 4089742414। আমি একটি #scan ও যোগ করলাম কারণ আমি পছন্দ করি এটি আরও স্পষ্ট এক্সপ্রেস করে যে আমরা কিছু নির্দিষ্ট জিনিস লক্ষ্য করছি, সব কিছু যা আমরা চাই না সেগুলো রিমুভ করার চেষ্টা করার বদলে।

Benchmark.ips do |x| x.config(time: 30, warmup: 2) x.report ('gsub') { string.gsub(/[^0-9] /, '') } x.report('tr') { string.tr("^0-9", "") } x.report('delete_chars') { string.delete("^0-9") } x.report('scan') { string.scan(/[0-9]/).join } x.compare! end
আবার অনুমান করুন, তারপর টগল খুলুন উত্তর দেখতে
Comparison: delete_chars: 2006750.8 i/s tr: 1856429.0 i/s - 1.08x slower gsub: 523174.7 i/s - 3.84x slower scan: 227717.4 i/s - 8.81x slower 
রেগেক্স ব্যবহার করলে স্লো হয়, সেটি আশ্চর্য নয়। এবং #scan-এর ইচ্ছে প্রকাশকারী এক্সপ্রেশনেস আমাদের ভয়ঙ্কর খরচ দিয়েছে। কিন্তু রুবির স্পেশালাইজড মেথডগুলো ক্লিন আপ কীভাবে হ্যান্ডেল করে সেটি দেখে আমার আরও আগ্রহ জাগল।

মানিয়ে টাকা

চলুন সাবস্ট্রিং "€ " রিমুভ করার কিছু পথ চেষ্টা করি স্ট্রিং "€ 300"-থেকে। নিচের কিছু সমাধান একজাক্ট সাবস্ট্রিং "€ " স্পেসিফাই করে, কিছু সকল কারেন্সি সিম্বল বা সকল নন-নিউমেরিক্যাল ক্যারেক্টার রিমুভ করবে।

Benchmark.ips do |x| x.config(time: 30, warmup: 2) x.report('delete specific chars') { string.delete("€ ") } x.report('delete non-numericals') { string.delete("^0-9") } x.report('delete prefix') { string.delete_prefix("€ ") } x.report('delete prefix, strip') { string.delete_prefix("€").strip } x.report('gsub') { string.gsub(/€ /, '') } x.report('gsub-non-nums') { string.gsub(/[^0-9]/, '') } x.report('tr') { string.tr("€ ", "") } x.report('slice array') { string.chars.slice(2..-1).join } x.report('split') { string.split.last } x.report('scan nums') { string.scan(/\d/).join } x.compare! end
আপনি আশা করতে পারেন, এবং সঠিকই, যে জেতাবেন #deleteগুলির একটি। কিন্তু #delete ভ্যারিয়েন্টগুলোর মধ্যে কোনটি আপনি ফাস্টেস্ট হোনোর আশা করেন? প্লাস: অন্যান্য মেথডগুলির মধ্যে একটি কিছু #delete-এর চেয়ে ফাস্ট। কোনটি?
অনুমান করুন এবং তারপর খুলুন।
Comparison: delete prefix: 4236218.6 i/s delete prefix, strip: 3116439.6 i/s - 1.36x slower split: 2139602.2 i/s - 1.98x slower delete non-numericals: 1949754.0 i/s - 2.17x slower delete specific chars: 1045651.9 i/s - 4.05x slower tr: 951352.0 i/s - 4.45x slower slice array: 681196.2 i/s - 6.22x slower gsub: 548588.3 i/s - 7.72x slower gsub-non-nums: 489744.8 i/s - 8.65x slower scan nums: 418978.8 i/s - 10.11x slower 
আমি আশ্চর্য ছিলাম যে এমনকি অ্যারে স্লাইসিংও #gsub-এর চেয়ে ফাস্ট এবং আমি সবসময় খুশি হই #split-র স্পিড দেখে। এবং নোট করুন যে সকল নন-নিউমেরিক্যাল ডিলিট করা একটি স্পেসিফিক সাবস্ট্রিং ডিলিট করার চেয়ে ফাস্ট।

টাকার পথে চলুন

চলুন নম্বরের পরে কারেন্সি রিমুভ করি। (আমি স্লোয়ার #gsub ভ্যারিয়েন্টগুলো স্কিপ করলাম।)

Benchmark.ips do |x| x.config(time: 30, warmup: 2) x.report('gsub') { string.gsub(/ USD/, '') x.report('tr') { string.tr(" USD", "") } x.report('delete_chars') { string.delete("^0-9") x.report('delete_suffix') { string.delete_suffix(" USD") } x.report('to_i.to_s') { string.to_i.to_s } x.report("split") { string.split.first } x.compare! end
এখানে জেতার জন্য দুটি মেথডের মধ্যে টাই। আপনি কোন দুটোর প্রতিযোগিতা করবে ফাস্টেস্ট হওয়ার জন্য আশা করেন?
এবং: অনুমান করুন _কতটুকু_ স্লোয়ার `#gsub` এখানে।
Comparison: delete_suffix: 4354205.4 i/s to_i.to_s: 4307614.6 i/s - same-ish: difference falls within error split: 2870187.8 i/s - 1.52x slower delete_chars: 1989566.1 i/s - 2.19x slower tr: 1853957.1 i/s - 2.35x slower gsub: 524080.6 i/s - 13.22x slower 
সবসময় একটি স্পেশালাইজড মেথড থাকবে না যা আপনার नीড স্যাটিসফাই করবে। আপনি #to_i ব্যবহার করতে পারবেন না যদি আপনাকে লিডিং "0" রাখতে হয়। এবং #delete_suffix ভয়ঙ্করভাবে নির্ভর করে এই অ্যাসাম্পশন ওপর যে কারেন্সি ইউএস ডলার। স্পেশালাইজড মেথডগুলো প্রিসিশন টুলসের মত—একটি নির্দিষ্ট টাস্কের জন্য একটি নির্দিষ্ট কনটেক্সটে উপযোগী। তাই সবসময় এমন কেস থাকবে যেখানে #gsub ঠিক যা আপনার প্রয়োজন। এটি ভার্সাটাইল, এবং এটি সবসময় টপ অফ মাইন্ডে থাকে। কিন্তু এটি কিছুটা হার্ডার টু প্রসেস এবং প্রায়শই স্লোয়ার, এমনকি আমার আশার চেয়ে স্লোয়ার। আমার কাছে, রুবির সমৃদ্ধি একটা কারণ যা এটিকে খুব মজাদার করে দেয় কাজ করার জন্য। স্পিড উইনগুলো একটি ভালো বোনাস।

  1. রুবিতে র‍্যান্ডম নম্বর ও স্ট্রিং: প্র্যাকটিক্যাল গাইড

  2. রুবি স্ট্রিং ফরম্যাটিং: লিডিং জিরো, কলাম ও printf স্টাইল সহজে

  3. রুবি স্ট্রিং এস্কেপিং মাস্টার করুন: কোট এবং স্পেশাল ক্যারেক্টার হ্যান্ডলিং

  4. জাভাতে স্ট্রিং তুলনা: Equals, equalsIgnoreCase এবং '==' এড়ানো