새로운 Ruby 버전은 계속 개선되고 있으며 Ruby 2.5도 다르지 않습니다.
루비 2.5 다음과 같은 최적화를 소개합니다.
- 큰 문자열이 생성되면 문자열 보간 속도가 약 72% 빨라집니다.
- String#prepend는 하나의 인수만 제공되는 경우 약 42% 더 빠릅니다.
- Enumerable#sort_by, Enumerable#min_by 및 Enumerable#max_by가 약 50% 빨라집니다.
몇 가지 벤치마크를 살펴보겠습니다!
문자열 보간 성능
이 최적화를 위해 커밋 메시지에서 예제 코드를 가져왔습니다.
require 'benchmark/ips' Benchmark.ips do |x| x.report "Large string interpolation" do |t| a = "Hellooooooooooooooooooooooooooooooooooooooooooooooooooo" b = "Wooooooooooooooooooooooooooooooooooooooooooooooooooorld" t.times { "#{a}, #{b}!" } end x.report "Small string interpolation" do |t| a = "Hello" b = "World" t.times { "#{a}, #{b}!" } end x.compare! end
이 벤치마크를 실행한 결과는 다음과 같습니다.
루비 2.4.1 :
Small string interpolation: 3236291.1 i/s Large string interpolation: 1711633.4 i/s - 1.89x slower
루비 2.5 :
Small string interpolation: 3125175.1 i/s Large string interpolation: 2555782.6 i/s - 1.22x slower
보시다시피 큰 문자열의 차이는 상당히 뛰어납니다!
String#prepend 성능
prepend 메소드를 사용하면 배열 앞에 텍스트를 삽입할 수 있습니다.
Ruby 2.5는 가장 일반적인 경우에 대해 최적화하여 한 문자열만 다른 문자열 앞에 추가합니다.
다음은 벤치마크 결과입니다.
루비 2.4.1 결과:
String#prepend 3.428M (± 3.2%) i/s - 17.159M in 5.011008s
루비 2.5 결과:
String#prepend 4.638M (± 3.6%) i/s - 23.276M in 5.025562s
아주 좋은 개선 사항입니다!
수많은 성능 향상
몇 가지 Enumerable 메서드가 성능을 업그레이드하고 있습니다.
이 특정 최적화는 <=>
에 대한 메소드 디스패칭을 건너뛰기 때문에 작동합니다. 방법.
커밋 메시지에 설명된 대로:
<블록 인용>
"OPTIMIZED_CMP()를 사용하여 <=>
대신 개체를 비교하십시오. Fixnum/Float/String 개체에 대한 메서드 디스패치."
다음은 벤치마크 결과입니다.
루비 2.4.2 :
Enumerable#sort_by 2.395k (± 6.7%) i/s - 11.952k in 5.014422s Enumerable#min_by 8.244k (± 6.1%) i/s - 41.405k in 5.042327s Enumerable#max_by 8.053k (± 6.7%) i/s - 40.180k in 5.015375s
루비 2.5 :
Enumerable#sort_by 5.914k (± 6.7%) i/s - 29.786k in 5.062584s Enumerable#min_by 15.668k (± 3.0%) i/s - 78.888k in 5.039748s Enumerable#max_by 15.544k (± 2.3%) i/s - 78.408k in 5.046709s
약 50% 개선되었습니다 🙂
범위#최소 및 범위#최대
두 가지 보너스 성능 최적화가 있습니다!
하나는 Range#min 및 Range#max 방법에 관한 것입니다.
다음은 벤치마크입니다.
루비 2.4.2
Range#min 7.976M (± 3.0%) i/s - 39.950M in 5.013242s Range#max 7.996M (± 3.4%) i/s - 40.059M in 5.015984s
루비 2.5
Range#min 13.154M (± 3.0%) i/s - 65.731M in 5.002094s Range#max 13.021M (± 2.6%) i/s - 65.202M in 5.010924s
여기에서 커밋을 찾으세요.
개선된 문자열#scan
커밋 메시지에 따르면 이것은 문자열 패턴의 경우 50%, 정규식 패턴의 경우 10%의 성능을 향상시킵니다.
벤치마크를 살펴보겠습니다!
루비 2.4.2
String#scan - String pattern 1.367M (±19.8%) i/s - 6.458M in 4.982047s String#scan - Regex pattern 1.228M (±17.0%) i/s - 5.881M in 4.983943s
루비 2.5
String#scan - String pattern 3.944M (±24.4%) i/s - 17.739M in 4.977417s String#scan - Regex pattern 1.696M (±17.4%) i/s - 8.103M in 4.982614s
더 빠른 스캔을 즐겨보세요!
요약
12월 25일에 출시될 Ruby 2.5의 새로운 최적화 기능에 대해 배웠습니다.
이러한 최적화는 문자열 보간, Enumerable 메서드, String#prepend
메소드, String#scan
메소드 및 Range#max
/ Range#mix
방법.
이 게시물이 도움이 되었기를 바랍니다!
게시물 공유를 잊지 마세요. 좋아하는 소셜 네트워크에서 🙂