কম্পিউটার

কোনটি দ্রুততম? ERB বনাম HAML বনাম স্লিম

এই নিবন্ধে, আমরা তিনটি জনপ্রিয় রুবি টেমপ্লেটিং ইঞ্জিনের কার্যক্ষমতা পরীক্ষা এবং বিশ্লেষণ করব:ERB (ডিফল্ট একটি), HAML এবং SLIM৷

বেঞ্চমার্কিং হল ব্যবসায়িক প্রক্রিয়া এবং কর্মক্ষমতা মেট্রিক্সকে শিল্পের সেরা এবং অন্যান্য কোম্পানির সেরা অনুশীলনের সাথে তুলনা করার অনুশীলন। এদিকে, লোড টেস্টিং হল একটি সিস্টেমে চাহিদা রাখার এবং এর প্রতিক্রিয়া পরিমাপ করার প্রক্রিয়া৷

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

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

সেটআপ

অবশ্যই, প্রথম জিনিসটি নিশ্চিত করা যে আপনি ইতিমধ্যেই রুবি ইনস্টল করেছেন। আমরা এই নিবন্ধটি লেখার সবচেয়ে সাম্প্রতিক সংস্করণ, 2.7.0 ব্যবহার করছি। রেল রত্নটিও ইনস্টল করা নিশ্চিত করুন৷

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

এখন, আমাদের রেল প্রকল্পের জন্য একটি ফোল্ডার নির্বাচন করুন এবং নিম্নলিখিত কমান্ডটি চালান:

rails new haml-slim-erb

এটি সমস্ত প্রয়োজনীয় নির্ভরতা ডাউনলোড করবে এবং আমাদের স্ক্যাফোল্ডেড রেল প্রকল্প তৈরি করবে। এগিয়ে যান এবং এটি অন্বেষণ করুন৷

কোডে এগিয়ে যাওয়ার আগে, আমাদের Gemfile-এ SLIM এবং HAML নির্ভরতা যোগ করতে হবে :

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
  gem 'haml'
  gem 'slim'
end

এছাড়াও একটি বাগ রয়েছে যা SQLite সংস্করণের সাথে সম্পর্কিত প্রকল্পের সাথে ডিফল্টরূপে আসে। এটিকে Gemfile-এ খুঁজুন এবং এটিকে নিম্নলিখিতগুলিতে পরিবর্তন করুন:

gem 'sqlite3', '~> 1.3.0'

এখন, bundle install চালান নির্ভরতা ডাউনলোড করার জন্য কমান্ড।

বেঞ্চমার্ক মডিউল অন্বেষণ

নিবন্ধের এই অংশের জন্য, আমরা সরাসরি পরীক্ষা নিয়ে কাজ করব ফোল্ডার এটি খুলুন, এবং আপনি কিছু খালি ফোল্ডার দেখতে পাবেন। চলুন বেঞ্চমার্ক নামে একটি নতুন তৈরি করি এবং অন্য তিনটি ফাইল:example_1_test.rb , example_2_test.rb , এবং example_3_test.rb. .

রুবিকে পরীক্ষা দিয়ে শেষ করতে হবে একটি পরীক্ষা ফাইল হিসাবে বিবেচিত হবে।

এর পরে, প্রথম ফাইলে নিম্নলিখিত বিষয়বস্তু যোগ করুন:

require 'benchmark'

number = (0..50).to_a.sort{ rand() - 0.5 }[0..10000]

puts Benchmark.measure {
  20_000.times do
    number[rand()] * (0..50).to_a.sort{ rand() - 0.5 }[0..10000][rand()]
  end
}

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

পদ্ধতি measure এটি খুব দরকারী কারণ এটি প্রক্রিয়া করতে কতটা সময় নিচ্ছে তা পরিমাপ করতে আপনার রুবি কোডের যে কোনও জায়গায় এটি স্থাপন করা যেতে পারে। এই সময়টি puts দ্বারা ফেরত এবং মুদ্রিত হয় .

ভিতরে, আমরা একই র্যান্ডম-জেনারেটেড অ্যারের এক্সিকিউশনের 20k বার লুপ করছি যাতে প্রতিটির একটি মান গুণ করা যায়।

এই পরীক্ষা ফাইলটি বিশেষভাবে চালানোর জন্য, নিম্নলিখিত কমান্ডটি জারি করুন:

rake test TEST=test/benchmark/example_1_test.rb

ফলাফল এই মত দেখতে পারে:

0.702647   0.012353   0.715000 (  0.721910)

এই রিপোর্টটি প্রিন্ট করে, যথাক্রমে, ব্যবহারকারীর CPU সময়, সিস্টেম CPU সময়, ব্যবহারকারী এবং সিস্টেম CPU সময়ের যোগফল এবং অতিবাহিত রিয়েল-টাইম। সময়ের একক সেকেন্ড।

আমরা অনুশীলনে আরও অন্যান্য বেঞ্চমার্ক পদ্ধতি ব্যবহার করব।

ইনলাইন টেমপ্লেট পরীক্ষা

এখন যেহেতু আপনি রুবির বেঞ্চমার্ক মডিউল কীভাবে কাজ করে সে সম্পর্কে আরও কিছুটা বুঝতে পেরেছেন, আমরা তিনটি টেমপ্লেটের উপর কিছু পরীক্ষা চালানোর মধ্যে ডুব দেব।

এর জন্য, আমরা একটি একক টেমপ্লেট তৈরি করব, এটিকে তিনটি ইঞ্জিন সিনট্যাক্সে অনুবাদ করব এবং অবশেষে, বেঞ্চমার্ক পদ্ধতির অধীনে এটি চালাব।

দ্বিতীয় পরীক্ষা ফাইলে নিম্নলিখিত যোগ করুন:

require 'erb'
require 'haml'
require 'slim'
require 'benchmark'
require 'ostruct'

notes = OpenStruct.new title: 'Write an essay', description: 'My essay is about...', randomList: (0..50).to_a.sort{ rand() - 0.5 }[0..10000]

erb_example = <<-ERB_EXAMPLE
<span><%= notes.title %></span>
<span><%= notes.description %></span>
<table>
  <tr>
    <% notes.randomList.each do |note| %>
      <td><%= note %></td>
    <% end %>
  </tr>
</table>
ERB_EXAMPLE

slim_example = <<-SLIM_EXAMPLE
span= notes.title
span= notes.description
table
  tr
    - notes.randomList.each do |note|
      td= note
SLIM_EXAMPLE

haml_example = <<-HAML_EXAMPLE
%span= notes.title
%span= notes.description
%table
  %tr
    - notes.randomList.each do |note|
      %td= note
HAML_EXAMPLE

context = OpenStruct.new notes: notes
__result = ''

Benchmark.bmbm(20) do |bcmk|
  bcmk.report("erb_test") { (1..2000).each { ERB.new(erb_example, 0, '-', '__result').result binding } }
  bcmk.report("slim_test") { (1..2000).each{ __result = Slim::Template.new { slim_example }.render(context) } }
  bcmk.report("haml_test") { (1..2000).each { __result = Haml::Engine.new(haml_example).render(binding) } }
end

প্রথমত, প্রয়োজনীয় মডিউল আমদানি করুন। টেমপ্লেট ইঞ্জিনগুলি ছাড়া, আমরা ostructও আমদানি করছি মডিউল একটি OpenStruct মেটাপ্রোগ্রামিং থেকে একটি ডেটা স্ট্রাকচার, একটি Hash এর অনুরূপ , যা তাদের সহগামী মানগুলির সাথে নির্বিচারে বৈশিষ্ট্যগুলির সংজ্ঞার অনুমতি দেয়৷

এটি দরকারী কারণ মানগুলি সংরক্ষণ করার জন্য আমাদের একটি সম্পূর্ণ শ্রেণি কাঠামো তৈরি করতে হবে না। আমরা এটিকে ইনলাইনে সংজ্ঞায়িত করতে পারি।

আমাদের struct মূলত একটি Note একটি শিরোনাম, বর্ণনা, এবং এলোমেলো সংখ্যার একটি তালিকা সহ বস্তু, যা প্রক্রিয়াকরণের সময় বাড়ায়৷

আমরা প্রতিটি টেমপ্লেট ইঞ্জিন কিভাবে কাজ করে তার উপর ফোকাস করব না; আপনি এটির জন্য তাদের অফিসিয়াল ডক্স উল্লেখ করতে পারেন। যাইহোক, তাদের সিনট্যাক্স একীভূত করা বেশ সহজ।

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

অবশেষে, প্রতিটি bmbm এর অভ্যন্তরীণ কোড লাইন প্রতিটি টেমপ্লেট তৈরি করার সময় 2000 বার একটি লুপ চালায়। ফোকাস টেমপ্লেট বরাদ্দ করা এবং এটি রেন্ডার করা।

এই টেস্ট ফাইলটি কার্যকর করার পরে, এখানে ফলাফল:

Rehearsal --------------------------------------------------------
erb_test               0.311534   0.002963   0.314497 (  0.314655)
slim_test              2.544711   0.004520   2.549231 (  2.550307)
haml_test              1.449813   0.003169   1.452982 (  1.454118)
----------------------------------------------- total: 4.316710sec

                           user     system      total        real
erb_test               0.298730   0.000679   0.299409 (  0.299631)
slim_test              2.550665   0.004148   2.554813 (  2.556023)
haml_test              1.432653   0.001984   1.434637 (  1.435417)

রিহার্সাল থেকে বাস্তব কী তা একীভূত করতে আপনার জন্য দুটি ফলাফল ব্লক আলাদা করা হয়েছে।

দৃষ্টিকোণ কিছুটা পরিবর্তন করা হচ্ছে

শেষ পরীক্ষার ফলাফলের জন্য, আপনি ধরে নিতে পারেন যে ERB হল সেরা বিকল্প, যখন SLIM হল সবচেয়ে খারাপ৷ আবার, এটা পরিস্থিতির উপর নির্ভর করে।

সেই পরীক্ষায়, যতবার আমরা লুপ করি, আমাদের একটি নতুন তাৎক্ষণিক করতে হবে টেমপ্লেট ইঞ্জিন অবজেক্ট। এটি একটি সর্বোত্তম প্রবাহ নয়৷

আসুন এটিকে সামান্য পরিবর্তন করি এবং নিম্নলিখিত কোড স্নিপেটে দেখানো হিসাবে এই ইন্সট্যান্টেশনটিকে বাইরে নিয়ে যাই:

erb_engine = ERB.new(erb_example, 0, '-', '__result')
slim_engine = Slim::Template.new { slim_example }
haml_engine = Haml::Engine.new(haml_example)

Benchmark.bmbm(10) do |bcmk|
  bcmk.report("erb_test") { (1..2000).each { erb_engine.result binding } }
  bcmk.report("slim_test") { (1..2000).each{ __result = slim_engine.render(context) } }
  bcmk.report("haml_test") { (1..2000).each { __result = haml_engine.render(binding) } }
end

কোড ঠিক আগের মতই করে। এখন, আবার পরীক্ষা চালান, এবং আপনি ফলস্বরূপ এরকম কিছু দেখতে পাবেন:

Rehearsal ----------------------------------------------
erb_test     0.127599   0.002407   0.130006 (  0.130137)
slim_test    0.046972   0.000841   0.047813 (  0.047858)
haml_test    0.208308   0.002239   0.210547 (  0.210769)
------------------------------------- total: 0.388366sec

                 user     system      total        real
erb_test     0.118002   0.000556   0.118558 (  0.118618)
slim_test    0.040129   0.000090   0.040219 (  0.040320)
haml_test    0.205331   0.001163   0.206494 (  0.206680)

এখন কোনটি সেরা এবং সবচেয়ে খারাপ তা লক্ষ্য করুন। এটি শুধুমাত্র দেখানোর জন্য যে একটি নিখুঁত ইঞ্জিনের পরিপ্রেক্ষিতে কোন রূপালী বুলেট নেই।

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

লোড টেস্টিং একটি বাস্তব-বিশ্বের দৃশ্যকল্প

আসুন আমাদের বাস্তবতার কাছাকাছি কিছুতে এগিয়ে যাই। আমরা একটি বাস্তব টেমপ্লেট বেঞ্চমার্ক করতে যাচ্ছি যা কিছু নোটের তালিকা করে (প্রতিটি টেমপ্লেট ইঞ্জিনের জন্য তিনটি, একটি)।

যেহেতু benchmark মডিউলটি রেল কোডে স্থান নেয়, আমরা টেমপ্লেট ইঞ্জিনের অভ্যন্তরীণ প্রক্রিয়াগুলির সাথে সম্পর্কিত কিছু গুরুত্বপূর্ণ ব্যবস্থা হারিয়ে ফেলি৷

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

প্রথমে, আসুন প্রতিটি উদাহরণের জন্য রেল কন্ট্রোলার তৈরি করি:

rails g controller notes_erb index
rails g controller notes_haml index
rails g controller notes_slim index

এই কমান্ডটি অটো-জেনারেট করবে সাধারণ রেল ফাইলগুলির একটি গুচ্ছ যা আপনি ব্যবহার করতে পারেন৷

এরপর, চলুন notes_erb_controller.rb খুলি ফাইল তৈরি করুন এবং এর বিষয়বস্তুতে পরিবর্তন করুন:

class NotesErbController < ApplicationController
  def index
    @notes = JSON.parse(Constants::NOTES, object_class: OpenStruct)
  end
end

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

মূলত, আমরা একটি ইনলাইন ধ্রুবক থেকে কিছু JSON ধরছি। প্রতিক্রিয়া একটি নতুন OpenStruct-এ পার্স করা হবে অবজেক্ট এবং ইঞ্জিনে ফিরে আসে।

NOTES ধ্রুবককে অবশ্যই constants.rb নামে একটি নতুন ফাইলে স্থাপন করতে হবে . এগিয়ে যান এবং এটি তৈরি করুন, এবং তারপর নিম্নলিখিত বিষয়বস্তু যোগ করুন:

class Constants
    NOTES = '[
        {
            "title": "Walk the dog",
            "description": "Bla bla",
            "tasks": [{
                "title": "Task #1"
            },
            {
                "title": "Task #2"
            },
            {
                "title": "Task #3"
            }]
        },
        ...
        {
            "title": "Walk the dog",
            "description": "Bla bla",
            "tasks": [{
                "title": "Task #1"
            },
            {
                "title": "Task #2"
            },
            {
                "title": "Task #3"
            }]
        }
    ]
    '
end

অনুগ্রহ করে, আরো নোট উপাদানের জন্য উপবৃত্তাকার পরিবর্তন নিশ্চিত করুন। এছাড়াও, অন্য কন্ট্রোলারগুলির প্রতিটিতে যুক্তির প্রতিলিপি করতে ভুলবেন না৷

ERB ভিউ তৈরি করা

এখন, আমাদের উদাহরণের মতামত তৈরি করার সময় এসেছে। এটি করতে, views/notes_erb এ যান ফোল্ডার এবং অন্য দুটি ফাইল তৈরি করুন:note.html.erb এবং task.html.erb . তারা আমাদের একটি উদাহরণ তৈরি করতে সাহায্য করবে যাতে ভিউ, আংশিক এবং লেআউট রয়েছে।

এইভাবে, আমরা গ্যারান্টি দিচ্ছি যে আমাদের উদাহরণ রেল ইঞ্জিনগুলিকে সবচেয়ে বেশি অন্বেষণ করেছে। views/notes_haml উভয়ের সমতুল্য ফাইল তৈরি করা নিশ্চিত করুন এবং views/notes_slim .

চলুন শুরু করা যাক index.html.erb দিয়ে কোড:

<style>
h2 {
    text-align: center;
}

table, td, th {
  border: 1px solid #ddd;
  text-align: left;
}

table {
  border-collapse: collapse;
  width: 80%;
  margin: auto;
}

th, td {
  padding: 15px;
}
</style>
<h2>List of Notes</h2>
<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Description</th>
            <th>Tasks</th>
        </tr>
    </thead>
    <tbody>
        <%= render partial: 'notes_erb/note', collection: @notes %>
    </tbody>
</table>

এখানে খুব বিশেষ কিছু নেই. মনে রাখবেন যে আমরা একটি আংশিক আমদানি করছি, _note.html.erb ফাইল, এবং একটি collection পাস করা প্যারামিটার:আমাদের @notes পূর্বে কন্ট্রোলারে তৈরি।

এখানে নোটের বিষয়বস্তু, উপায় দ্বারা:

<tr>
  <td>
    <span><%= note.title %></span>
  </td>
  <td>
    <span><%= note.description %></span>
  </td>
  <td>
    <ul>
      <%= render partial: 'notes_erb/task', collection: note.tasks %>
    </ul>
  </td>
</tr>

এখানে আরেকটি আংশিক, tasks অ্যাক্সেস করা এই সময় অ্যারে।

_task.html.erb-এর বিষয়বস্তু নিম্নলিখিত:

<li><%= task.title %></li>

HAML এর ভিউ

আপনি লক্ষ্য করবেন যে এক ইঞ্জিন থেকে অন্য ইঞ্জিনের সিনট্যাক্স খুব মিল। কি পরিবর্তন হয় শুধু প্রতিটি এক শব্দ. SLIM, উদাহরণস্বরূপ, তাদের মধ্যে সবচেয়ে পরিষ্কার।

তিনটি ফাইলের কোডটি দেখুন:

# Content of index.html.haml
:css
  h2 {
      text-align: center;
  }

  table, td, th {
    border: 1px solid #ddd;
    text-align: left;
  }

  table {
    border-collapse: collapse;
    width: 80%;
    margin: auto;
  }

  th, td {
    padding: 15px;
  }

%h2 List of Notes
%table
  %thead
    %tr
      %th Title
      %th Description
      %th Tasks

  %tbody
    = render partial: 'notes_haml/note', collection: @notes

# Content of _note.html.haml
%tr
  %td
    %span= note.title


  %td
    %span= note.description


  %td
    %ul
      = render partial: 'notes_haml/task', collection: note.tasks

# Content of _task.html.haml
%li= task.title

খুব মিল, তাই না?

SLIM এর ভিউ

অবশেষে, আমরা SLIM এর মতামত আছে. এখানে অন্য দুটির থেকে সবচেয়ে বড় পার্থক্য। পুরো কাঠামো পরিষ্কার হয়ে যায়:

# index.html.slim
css:
  h2 {
      text-align: center;
  }

  table, td, th {
    border: 1px solid #ddd;
    text-align: left;
  }

  table {
    border-collapse: collapse;
    width: 80%;
    margin: auto;
  }

  th, td {
    padding: 15px;
  }

h2 List of Notes
table
  thead
    tr
      th Title
      th Description
      th Tasks

  tbody
    = render partial: 'notes_haml/note', collection: @notes

# _note.html.slim
tr
  td
    span= note.title


  td
    span= note.description


  td
    ul
      = render partial: 'notes_haml/task', collection: note.tasks

# _task.html.slim
li= task.title

আপনাকে প্রতিটি ইঞ্জিন সিনট্যাক্সে লেআউটগুলি অনুবাদ করতে হবে। দর্শন/লেআউটের অধীনে দুটি নতুন ফাইল তৈরি করতে হবে৷ ফোল্ডার:application.html.haml এবং application.html.slim .

আমি হোমওয়ার্ক হিসাবে আপনার উপর সেই কাজটি ছেড়ে দেব। যাইহোক, যদি আপনি এটি কঠিন মনে করেন, আপনি নিবন্ধের শেষে উপলব্ধ GitHub প্রকল্প লিঙ্কে আমার সংস্করণের সাথে পরামর্শ করতে পারেন৷

পরীক্ষা চালানো

অবশেষে, আমরা উদাহরণটি পরীক্ষা করতে পারি। প্রথমে, rails s চালিয়ে অ্যাপ্লিকেশনটি শুরু করুন আদেশ এটি https://localhost:3000/ ঠিকানায় শুরু হবে৷

ভিউটি কেমন হবে তা এখানে:

কোনটি দ্রুততম? ERB বনাম HAML বনাম স্লিম

প্রতিটি টেমপ্লেট ইঞ্জিনের উদাহরণ config/routes.rb-এ স্বয়ংক্রিয়ভাবে তৈরি হওয়া নিজ নিজ URL-এ উপলব্ধ হবে। ফাইল।

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

$ hey https://localhost:3000/notes_erb/index

Summary:
  Total:        9.3978 secs
  Slowest:      9.1718 secs
  Fastest:      0.0361 secs
  Average:      1.2714 secs
  Requests/sec: 21.2816

$ hey https://localhost:3000/notes_haml/index
Summary:
  Total:        10.8661 secs
  Slowest:      10.2354 secs
  Fastest:      0.1871 secs
  Average:      1.4735 secs
  Requests/sec: 18.4058

$ hey https://localhost:3000/notes_slim/index

Summary:
  Total:        11.3384 secs
  Slowest:      10.7570 secs
  Fastest:      0.0437 secs
  Average:      1.5406 secs
  Requests/sec: 17.6392

আপনি দেখতে পাচ্ছেন, সমস্ত ইঞ্জিনগুলি কার্যকর করার সময়ের ক্ষেত্রে খুব কাছাকাছি। চালানোর জন্য অনুরোধের ডিফল্ট সংখ্যা 200, কিন্তু আপনি -n এর মাধ্যমে এই মান পরিবর্তন করতে পারেন বিকল্প।

আসুন 1200 টি অনুরোধের সাথে সম্পাদিত একই পরীক্ষাগুলি একবার দেখে নেওয়া যাক:

$ hey -n 1200 https://localhost:3000/notes_erb/index

Summary:
  Total:        52.2586 secs
  Slowest:      19.2837 secs
  Fastest:      0.0389 secs
  Average:      0.6960 secs
  Requests/sec: 22.9627

$ hey -n 1200 https://localhost:3000/notes_haml/index
Summary:
  Total:        61.7637 secs
  Slowest:      18.5290 secs
  Fastest:      0.0442 secs
  Average:      0.8557 secs
  Requests/sec: 19.4289

$ hey -n 1200 https://localhost:3000/notes_slim/index

Summary:
  Total:        63.1625 secs
  Slowest:      19.9744 secs
  Fastest:      0.0874 secs
  Average:      0.7959 secs
  Requests/sec: 18.9986

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

Hey টুলটি অন্যান্য তথ্যও প্রিন্ট করে, যেমন একটি রেসপন্স টাইম হিস্টোগ্রাম:

কোনটি দ্রুততম? ERB বনাম HAML বনাম স্লিম

এটি আনুমানিক শর্তে প্রতিটি অনুরোধ সম্পূর্ণ হতে গড় সময় দেখায়। আমাদের উদাহরণে, এটা স্পষ্ট যে বেশিরভাগ অনুরোধ (1048) 1.893 সেকেন্ডে সম্পন্ন হয়েছিল। এই কারণেই একই সময়ে স্ট্রেস পরীক্ষা করা বাঞ্ছনীয়।

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

আরো কাস্টম বিকল্প/ফলাফলের জন্য ডক্স চেক করুন।

সারাংশ

আপনি এখানে এই উদাহরণের জন্য সোর্স কোড খুঁজে পেতে পারেন।

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

আরেকটি আকর্ষণীয় বিষয় হল যে ডিফল্ট রেল ইঞ্জিন হিসাবে ERB, এটির কাজেও দুর্দান্ত। আমাদের কিছু পরীক্ষায় অন্যান্য ইঞ্জিনগুলি দ্রুততর হওয়ার পাশাপাশি, ERB সর্বদা তার মান প্রমাণ করার জন্য যথেষ্ট কাছাকাছি থাকে৷

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


  1. চার্টার/স্পেকট্রাম স্পিড টেস্ট

  2. Avast বনাম Malwarebytes:কোনটি ভাল?

  3. আপনার এলাকায় কোন ভিপিএন দ্রুততম? এই বিনামূল্যের টুল আপনাকে বলে

  4. আপনি কোন রুবি আইডিই ব্যবহার করবেন?