11/08/2018, 21:24

Sự khác biệt giữa (<< & +=) của việc nối chuỗi trong String

Nhìn ví dụ dưới đây: Nối chuỗi với += first_name = "Paul" name = first_name last_name = "Brian" name += last_name Bây giờ mình kiểm tra: name ==> nó trả về kết quả PaulBrian first_name ==> nó trả về kết quả Paul Nối chuỗi với << first_name = ...

Nhìn ví dụ dưới đây:

Nối chuỗi với +=

first_name = "Paul"
name = first_name
last_name = "Brian"
name += last_name

Bây giờ mình kiểm tra:

  • name ==> nó trả về kết quả PaulBrian
  • first_name ==> nó trả về kết quả Paul

Nối chuỗi với <<

first_name = "Paul"
name = first_name
last_name = "Brian"
name << last_name

Bây giờ mình kiểm tra:

  • name ==> nó trả về kết quả PaulBrian
  • first_name ==> nó trả về kết quả PaulBrian

Vì sao lại có kết quả như vậy?
Chúng ta sẽ kiểm tra **object_id* của name, first_name:*

first_name = "Paul"
name = first_name
name.object_id --> 70148644941380
first_name.object_id --> 70148644941380

Phép gán name = first_name lúc này name & first_name có cùng 1 object_id và khi thực hiện:

  • << nó sẽ xử lý trực tiếp trên object của nó, vì vậy khi name thay đổi thì first_name cũng thay đổi theo.
  • += nó sẽ tạo ra một object mới, vì vậy khi thay đổi name thì first_name không bị ảnh hưởng.

Đánh giá
Mình sẽ sử dụng benchmark để xem thời gian thực hiện của 2 cách làm này

require 'benchmark`

n = 10000

Benchmark.bm do |benchmark|
  benchmark.report("+=") do
    n.times do
      first_name = "Paul"
      name = first_name
      last_name = "Brian"
      name += last_name
    end
  end

  benchmark.report("<<") do
    n.times do
      first_name = "Paul"
      name = first_name
      last_name = "Brian"
      name << last_name
    end
  end
end

Kết quả:

       user     system      total        real
+=  0.010000   0.000000   0.010000 (  0.007283)
<<  0.000000   0.000000   0.000000 (  0.004042)

Qua đó mình thấy được tốc độ xử lý của << sẽ hiệu quả hơn +=

0