Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

อันไหนเร็วที่สุด? ERB กับ HAML กับ Slim

ในบทความนี้ เราจะทดสอบและวิเคราะห์ประสิทธิภาพของเครื่องมือสร้างเทมเพลต Ruby ที่ได้รับความนิยมสูงสุด 3 รายการ ได้แก่ ERB (ค่าเริ่มต้น) HAML และ SLIM

การเปรียบเทียบคือแนวปฏิบัติในการเปรียบเทียบกระบวนการทางธุรกิจและตัวชี้วัดประสิทธิภาพกับสิ่งที่ดีที่สุดในอุตสาหกรรมและแนวปฏิบัติที่ดีที่สุดจากบริษัทอื่นๆ ในขณะเดียวกัน การทดสอบโหลดเป็นกระบวนการวางความต้องการระบบและวัดการตอบสนอง

เป้าหมายของเราคือการสำรวจโมดูล Ruby Benchmark เล็กน้อย ซึ่งมีวิธีการวัดและรายงานเวลาที่ใช้ในการรันโค้ด Ruby เราจะสร้างเทมเพลตอินไลน์ ทดสอบกับการทดสอบ และแยกเมตริกออกจากเครื่องมือต่างๆ ทั้งสามแบบ

หลังจากนั้น เราจะเจาะลึกการทดสอบโหลดโดยการสร้างมุมมองเทมเพลตในโลกแห่งความเป็นจริง นำเทมเพลตเหล่านั้นไปใช้งานจริงบนเซิร์ฟเวอร์ จากนั้นทำการทดสอบโหลดผ่านเครื่องมือ hey มันให้คุณสมบัติที่ยอดเยี่ยมแก่เราในการส่งโหลดไปยังเว็บแอปพลิเคชันเฉพาะ และรับข้อมูลโดยละเอียดเกี่ยวกับวิธีการทำงานของแต่ละจุดสิ้นสุด และด้วยเหตุนี้ เครื่องมือเทมเพลตแต่ละรายการจึงทำงาน

ตั้งค่า

สิ่งแรกที่ต้องทำคือต้องแน่ใจว่าคุณติดตั้ง Ruby แล้ว เรากำลังใช้เวอร์ชันล่าสุด 2.7.0 ในขณะที่เขียนบทความนี้ อย่าลืมติดตั้ง Rails gem ด้วย

Ruby and the Rails gem เป็นสิ่งที่เราต้องเริ่มต้น สำหรับบทช่วยสอนนี้ Visual Studio Code คือ IDE สำหรับการเข้ารหัส แต่คุณสามารถเลือกรหัสอื่นได้หากต้องการ

ตอนนี้ เลือกโฟลเดอร์สำหรับโครงการ Rails ของเราและเรียกใช้คำสั่งต่อไปนี้:

rails new haml-slim-erb

สิ่งนี้จะดาวน์โหลดการพึ่งพาที่จำเป็นทั้งหมดและสร้างโครงการ Rails นั่งร้านของเรา ไปข้างหน้าและสำรวจมัน

ก่อนดำเนินการกับโค้ด เราจำเป็นต้องเพิ่มการพึ่งพา SLIM และ HAML ใน Gemfile ของเรา :

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 คำสั่งดาวน์โหลดการขึ้นต่อกัน

สำรวจโมดูลเกณฑ์มาตรฐาน

สำหรับส่วนนี้ของบทความนี้ เราจะดำเนินการโดยตรงกับ การทดสอบ โฟลเดอร์ เปิดแล้วคุณจะเห็นโฟลเดอร์ว่าง มาสร้างอันใหม่ชื่อ benchmark . กันเถอะ และอีกสามไฟล์:example_1_test.rb , example_2_test.rb และ example_3_test.rb. .

Ruby ต้องการให้จบด้วย test ให้ถือว่าเป็นไฟล์ทดสอบ

ถัดไป เพิ่มเนื้อหาต่อไปนี้ในไฟล์แรก:

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
}

โปรดทราบว่าบรรทัดแรกนำเข้าโมดูลเกณฑ์มาตรฐานที่จำเป็น จากนั้น เราสร้างอาร์เรย์สุ่มของตัวเลขตั้งแต่ 0 ถึง 50 ด้วยขนาด 10.000 ตัวเลขจำนวนมากเหล่านี้ใช้เวลาดำเนินการไม่นาน

วิธีการ measure มีประโยชน์มากเพราะสามารถวางไว้ที่ใดก็ได้ในโค้ด Ruby ของคุณเพื่อวัดระยะเวลาที่ใช้ในการประมวลผล เวลานี้จะถูกส่งกลับและพิมพ์โดย puts .

ข้างในเรากำลังวนซ้ำ 20,000 เท่าของการทำงานของอาร์เรย์ที่สร้างแบบสุ่มเดียวกันเพื่อคูณหนึ่งค่าของแต่ละค่า

หากต้องการเรียกใช้ไฟล์ทดสอบนี้โดยเฉพาะ ให้ใช้คำสั่งต่อไปนี้:

rake test TEST=test/benchmark/example_1_test.rb

ผลลัพธ์อาจมีลักษณะดังนี้:

0.702647   0.012353   0.715000 (  0.721910)

รายงานนี้พิมพ์ตามลำดับ เวลา CPU ของผู้ใช้ เวลา CPU ของระบบ ผลรวมของเวลา CPU ของผู้ใช้และของระบบ และตามเวลาจริงที่ผ่านไปตามลำดับ หน่วยของเวลาคือวินาที

เราจะใช้ประโยชน์จากวิธีเปรียบเทียบอื่นๆ ในทางปฏิบัติต่อไป

การทดสอบเทมเพลตอินไลน์

เมื่อคุณเข้าใจวิธีการทำงานของโมดูลเกณฑ์มาตรฐานของ Ruby มากขึ้นแล้ว เราจะลงลึกในการดำเนินการทดสอบบางอย่างในเทมเพลตทั้งสามนี้

สำหรับสิ่งนี้ เราจะสร้างเทมเพลตเดียว แปลเป็นสามรูปแบบกลไก และสุดท้าย เรียกใช้ภายใต้วิธีการเปรียบเทียบ

เพิ่มข้อมูลต่อไปนี้ในไฟล์ทดสอบที่สอง:

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 เป็นโครงสร้างข้อมูลจาก metaprogramming คล้ายกับ Hash ซึ่งช่วยให้สามารถกำหนดคุณลักษณะตามอำเภอใจพร้อมค่าที่มาพร้อมกันได้

มีประโยชน์เพราะเราไม่จำเป็นต้องสร้างโครงสร้างคลาสทั้งหมดเพื่อเก็บค่า เราสามารถกำหนดแบบอินไลน์ได้

struct ของเรานั้นเป็น Note วัตถุที่มีชื่อ คำอธิบาย และรายการตัวเลขสุ่ม ซึ่งเพิ่มเวลาในการดำเนินการ

เราจะไม่เน้นที่กลไกการทำงานของเทมเพลตแต่ละรายการ คุณสามารถอ้างถึงเอกสารอย่างเป็นทางการสำหรับสิ่งนี้ อย่างไรก็ตาม ไวยากรณ์ของพวกมันค่อนข้างง่ายต่อการดูดซึม

เวทย์มนตร์ถูกวางไว้ที่ส่วนท้ายของรหัส ตอนนี้ เรากำลังใช้ bmbm วิธีซึ่งทำมากกว่าวิธีแรกเล็กน้อย บางครั้ง ผลลัพธ์การวัดประสิทธิภาพอาจเบ้เนื่องจากปัจจัยภายนอก เช่น การรวบรวมขยะ หน่วยความจำรั่ว ฯลฯ วิธีนี้พยายามลดผลกระทบนี้ให้น้อยที่สุดโดยทำการทดสอบสองครั้ง:ครั้งแรกเป็นการซ้อมเพื่อให้สภาพแวดล้อมรันไทม์เสถียรและครั้งที่สอง เวลาจริง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่นี่

สุดท้าย bmbm . แต่ละอัน บรรทัดโค้ดภายในของรันการวนซ้ำ 2,000 ครั้งระหว่างการสร้างแต่ละเทมเพลต โฟกัสอยู่ที่การกำหนดเทมเพลตและแสดงผล

หลังจากรันไฟล์ทดสอบนี้แล้ว ผลลัพธ์ที่ได้คือ:

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)

สังเกตว่าอันไหนดีที่สุดและแย่ที่สุดตอนนี้ นี่เป็นเพียงเพื่อแสดงให้เห็นว่าไม่มีกระสุนเงินในแง่ของเครื่องยนต์ที่สมบูรณ์แบบ

คุณต้องทดสอบและวิเคราะห์ว่าคุณลักษณะใดทำงานได้ดีกว่าสำหรับรูปแบบการเขียนโค้ดของคุณ นอกจากนี้ยังมีเครื่องมือเสริมอื่นๆ เช่น Ruby Profiler ที่คุณสามารถใช้เพื่อทำความเข้าใจได้ดีขึ้นว่าโค้ดทำงานอย่างไรและทำไม

โหลดการทดสอบสถานการณ์จริง

ไปที่สิ่งที่ใกล้เคียงกับความเป็นจริงของเรามากขึ้น เราจะเปรียบเทียบเทมเพลตจริงที่มีบันทึกย่อ (สามรายการหนึ่งรายการสำหรับแต่ละเครื่องมือเทมเพลต)

ตั้งแต่ benchmark โมดูลเกิดขึ้นในโค้ด Rails เราสูญเสียมาตรการสำคัญบางอย่างที่เกี่ยวข้องกับกระบวนการภายในของเอ็นจิ้นเทมเพลต

การทดสอบเบนช์มาร์กประเภทนี้ช่วยให้เราเห็นว่าแต่ละเอ็นจิ้นทำงานอย่างไรโดยรวม ตั้งแต่เริ่มต้นกระบวนการผ่านการมาถึงของคำขอ ไปจนถึงการประมวลผลตรรกะทางธุรกิจ จนกระทั่งข้อมูลการตอบสนองไปถึงมุมมอง ขั้นตอนสุดท้ายนี้โดยเฉพาะจะมีขั้นตอนมากมาย เช่น กระบวนการแยกวิเคราะห์และการแสดงผลที่การทดสอบโหลดสามารถวัดได้ และ benchmark ไม่ได้

ขั้นแรก มาสร้างตัวควบคุม Rails สำหรับแต่ละตัวอย่าง:

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

คำสั่งนี้จะสร้างไฟล์ Rails ทั่วไปจำนวนมากที่คุณคุ้นเคยโดยอัตโนมัติ

ต่อไป มาเปิด 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 . สิ่งเหล่านี้จะช่วยเราสร้างตัวอย่างที่มีมุมมอง บางส่วน และเลย์เอาต์

ด้วยวิธีนี้ เรารับประกันว่าตัวอย่างของเราได้สำรวจเครื่องยนต์ Rails มากที่สุด ตรวจสอบให้แน่ใจว่าได้สร้างไฟล์ที่เทียบเท่ากับทั้ง 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/ address

มุมมองจะมีลักษณะดังนี้:

อันไหนเร็วที่สุด? ERB กับ HAML กับ Slim

ตัวอย่างเอ็นจิ้นเทมเพลตแต่ละรายการจะมีอยู่ที่ URL ที่เกี่ยวข้องซึ่งสร้างขึ้นโดยอัตโนมัติใน config/routes.rb ไฟล์.

ในการทดสอบการเปรียบเทียบ เราจะใช้เครื่องมือวัดประสิทธิภาพ มันง่ายมากและให้ข้อมูลที่เป็นประโยชน์สำหรับการวิเคราะห์เกณฑ์มาตรฐาน นี่คือคำสั่ง:

$ 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 กับ Slim

โดยจะแสดงเวลาเฉลี่ยที่แต่ละคำขอใช้ในการดำเนินการให้เสร็จสิ้นโดยสรุปเป็นค่าโดยประมาณ ในตัวอย่างของเรา เห็นได้ชัดว่าคำขอส่วนใหญ่ (1048) เสร็จสิ้นภายใน 1.893 วินาที นี่คือเหตุผลที่ควรทำการทดสอบความเครียดไปพร้อม ๆ กัน

นอกจากนี้ยังมีข้อมูลเพิ่มเติมเกี่ยวกับการกระจายเวลาแฝง รายละเอียดเกี่ยวกับการโทรและการค้นหา DNS การเขียนคำขอ เวลารอและการอ่าน ข้อผิดพลาด ฯลฯ

ตรวจสอบเอกสารสำหรับตัวเลือก/ผลลัพธ์ที่กำหนดเองเพิ่มเติม

สรุป

คุณสามารถค้นหาซอร์สโค้ดสำหรับตัวอย่างนี้ได้ที่นี่

การทดสอบประเภทนี้เหมาะอย่างยิ่งสำหรับการช่วยคุณกำหนดเครื่องมือเทมเพลตที่อาจเหมาะสมกับความต้องการของโครงการของคุณมากกว่า ดังที่เราได้เห็นแล้ว โปรดใช้ความระมัดระวังเกี่ยวกับโค้ดที่ใช้งานไม่ดี เนื่องจากข้อมูลโค้ดขนาดเล็กบางส่วนสามารถเปลี่ยนประสิทธิภาพโดยรวมของการดำเนินการได้ในทันที

อีกจุดที่น่าสนใจคือ ERB ซึ่งเป็นเอ็นจิ้น Rails เริ่มต้นนั้นทำงานได้ดีเช่นกัน นอกจากเอ็นจิ้นอื่นๆ จะเร็วขึ้นในการทดสอบของเราแล้ว ERB ก็อยู่ใกล้พอที่จะพิสูจน์คุณค่าของมันเสมอ

สุดท้ายนี้ เราขอแนะนำให้คุณพิจารณาปัจจัยสำคัญอื่นๆ ในการทดสอบว่าเป็นงานทำการบ้าน รวมถึงการแคช พร็อกซี การใช้ฐานข้อมูล และกลไกการจัดเก็บอื่นๆ ตลอดจนคิวและเครื่องมือในลักษณะที่ไม่ตรงกัน รายการเหล่านี้มักมีบทบาทสำคัญในลักษณะการทำงานของความคิดเห็นหรือเวลาในการประมวลผลที่ใช้ในการแสดงผล ขอให้โชคดี!