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 +=