আপনার চিন্তাভাবনাগুলিকে কোডে অনুবাদ করার সময়, সম্ভবত, আপনি সেই পদ্ধতিগুলি ব্যবহার করেন যা আপনি সবচেয়ে বেশি পরিচিত। এগুলি এমন পদ্ধতি যা মনের সেরা এবং স্বয়ংক্রিয়ভাবে আপনার কাছে আসে:আপনি একটি স্ট্রিং দেখতে পাচ্ছেন যা পরিষ্কার করা দরকার এবং আপনার আঙ্গুলগুলি সেই পদ্ধতিগুলি টাইপ করে যা ফলাফল পাবে৷
প্রায়শই, আপনি যে পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে টাইপ করেন তা হল সবচেয়ে সাধারণ রুবি পদ্ধতি, কারণ সেগুলিই আমরা অন্যদের তুলনায় বেশি পড়ি এবং লিখি, যেমন #gsub
স্ট্রিংগুলিতে অক্ষর প্রতিস্থাপন করার একটি সাধারণ পদ্ধতি। কিন্তু, রুবির কাছে অফার করার মতো আরও অনেক কিছু আছে, স্ট্যান্ডার্ড অপারেশনের জন্য আরও বিশেষ সুবিধার পদ্ধতি সহ।
আমি বেশিরভাগই রুবির সমৃদ্ধ বাগধারাটি পছন্দ করি কারণ এটি কোডটিকে আরও মার্জিত এবং সহজ করে তোলে। আমরা যদি এই সমৃদ্ধি থেকে উপকৃত হতে চাই, তাহলে আমাদের কোডের সহজতম অংশগুলিকেও রিফ্যাক্টর করার জন্য সময় ব্যয় করতে হবে-উদাহরণস্বরূপ, একটি স্ট্রিং পরিষ্কার করা-এবং আমাদের শব্দভাণ্ডার প্রসারিত করার জন্য কিছুটা প্রচেষ্টা লাগে। প্রশ্ন হল:অতিরিক্ত প্রচেষ্টা কি মূল্যবান?
স্পেস অপসারণের চারটি উপায়
এখানে একটি স্ট্রিং রয়েছে যা একটি ক্রেডিট কার্ড নম্বর উপস্থাপন করে:"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
এটি কেবল ধীরগতির নয়, এটি পাঠকের আর্গুমেন্টগুলিকে 'ডিকোড' করার জন্য একটি অতিরিক্ত প্রচেষ্টারও প্রয়োজন৷ চলুন দেখি এই তুলনাটি কীভাবে কাজ করে যখন কেবলমাত্র স্থানের চেয়ে বেশি পরিষ্কার করা হয়।
আপনার নম্বর চয়ন করুন
নিম্নলিখিত ফোন নম্বর নিন:'(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
s কিন্তু কোনটি #delete
আপনি কি দ্রুততম হতে আশা করেন? প্লাস:অন্যান্য পদ্ধতিগুলির মধ্যে একটি হল কিছু #delete
থেকে দ্রুত s কোনটি?
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
বিজয়ীদের মধ্যে একটি ড্র আছে। আপনি কোন 2টি দ্রুততম হওয়ার জন্য প্রতিদ্বন্দ্বিতা করতে চান?
<বিস্তারিত>সারাংশ>এবং:অনুমান করুন _কত_ ধীরগতির `#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
আমাদের প্রয়োজন ঠিক কি. এটি বহুমুখী, এবং এটি সর্বদা মনের শীর্ষে থাকে। তবে এটি প্রক্রিয়া করা কিছুটা কঠিন হতে পারে এবং প্রায়শই ধীরগতির হয়, এমনকি আমার প্রত্যাশার চেয়েও ধীর। আমার কাছে, রুবির সমৃদ্ধিও একটি কারণ যা এটির সাথে কাজ করতে এত মজা করে। গতির জয় একটি চমৎকার বোনাস।