Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 2.5의 성능 향상

새로운 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 방법.

이 게시물이 도움이 되었기를 바랍니다!

게시물 공유를 잊지 마세요. 좋아하는 소셜 네트워크에서 🙂