<p>рдЬрдВрдЧ рд╕реНрдХреИрди рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ</p>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рджрд┐рд╕ре░ 2013  ┬╖  28рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рд╕реБрд╕рдВрдзреНрдпрд╛ред рдореИрдВ рдПрдХ рдЫреВрдЯреЗ рд╣реБрдП рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдореИрдВ std::result::collect рдХреЛ FromIteratator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореЗрд░реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ iter::Scan , рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ --opt-level=3 рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╕рд╛рдмрд┐рдд рд╣реБрдЖред рдореИрдВрдиреЗ рдПрдХ рдХрд╕реНрдЯрдо рдЗрдЯрд░реЗрдЯрд░ рднреА рдмрдирд╛рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдореВрд▓ std::result::collect рдХреЗ рд╕рдорд╛рди рдЧрддрд┐ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ llvm рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Scan1::size_hint() std::iter::Scan::size_hint() рдкрджреНрдзрддрд┐ рд╕реЗ рднрд┐рдиреНрди рд╣реИред

cc @thestinger

C-enhancement I-slow P-low

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реБрдЖ, рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗред (рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ ( details рдмреНрд▓реЙрдХ рдореЗрдВ):

  • рдореИрдВрдиреЗ рдбреЙрдЯрдбреИрд╢-рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓рд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ bench_from_iter_with_scan рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдП: рдПрдХ рдЬреЛ @dotdash рдХреЗ рдкрд╛рд╕ рдерд╛ рд╡рд╣ рд╣реИ bench_from_iter_with_scan_passing_state , рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдмрдирд╛рдпрд╛ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдПрдХ рдлреНрд░реА-рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ () рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдХреНрдд-рдЪрд░ рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ-рдкреИрд░рд╛рдореАрдЯрд░ рд╢реИрд▓реА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред
  • рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ: https://gist.github.com/pnkfelix/7cb66d32c3cd9e1f2ea1a61ef15a0a3a
  • рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ 1.13 рд╕реЗ 1.33 рддрдХ рдбреЙрдЯрдбреИрд╢-рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдпрд╛ ( #![feature(test)] рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП RUSTC_BOOTSTRAP=1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
  • рдореИрдВрдиреЗ рдЗрд╕ рд╢реЗрд▓ рдЖрдордВрддреНрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкрд╛рдВрдЪ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛:
% for VERSION in 1.{13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}.0 ; do (\
  echo $VERSION && rustup update $VERSION && rustc +$VERSION --version && \
  RUSTC_BOOTSTRAP=1 rustc +$VERSION -C opt-level=3  --test main-bench.rs && \
   ./main-bench --bench && ./main-bench --bench && ./main-bench --bench && ./main-bench --bench && ./main-bench --bench \
) ; done | tee version-bench.txt
  • рдкреВрд░рд╛ рд▓реЙрдЧ рдЗрд╕ рд╕рд╛рд░ рдкрд░ рд╣реИ: https://gist.github.com/2db1e313af68ad6936a3da28c0c272f5
  • рдореИрдВрдиреЗ рд╕реНрдкреНрд░реИрдбрд╢реАрдЯ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдФрд╕рдд рдирд┐рдХрд╛рд▓рд╛ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдФрд╕рдд рдХреЗ рдмрдЬрд╛рдп рдиреНрдпреВрдирддрдо рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ), рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдкрд╖реНрдЯ-рдПрдбреЗрдкреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрд╛ рдЖрдзрд╛рд░рд┐рдд рдПрдХред
  • рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдФрд╕рдд рд▓рд┐рдпрд╛, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрд╕ рд╕рд╛рд░ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЧрдП рдФрд╕рдд рдХреЗ рд╕рдорд╛рди рд╣реИред

рдЕрд╡рд▓реЛрдХрди ( details рдмреНрд▓реЙрдХ рдореЗрдВ):

  • рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ 1.13 рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ (рдпрд╛рдиреА рдкреБрд░рд╛рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЗ рд▓рд┐рдП scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ (рдФрд░ filter_map рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдзреАрдорд╛) . рдпрд╣ 2016 рд╕реЗ @pmarcelll рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ 1.33 (рдореЗрд░реЗ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░) рд╕реЗ рдПрдХ рдирдореВрдирд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
rustc 1.13.0 (2c6933acc 2016-11-07)

running 4 tests
test bench_from_iter                         ... bench:       1,691 ns/iter (+/- 9)
test bench_from_iter_with_filter_map         ... bench:       1,930 ns/iter (+/- 230)
test bench_from_iter_with_scan_passing_state ... bench:       1,682 ns/iter (+/- 10)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,686 ns/iter (+/- 55)
  • 1.14 рдФрд░ 1.15 рдХреЗ рдмреАрдЪ, filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ, рд▓реЗрдХрд┐рди scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖-рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд░рд╣рд╛ред

  • 1.18 рдФрд░ 1.19 рдХреЗ рдмреАрдЪ, рд╕реНрдкрд╖реНрдЯ-рдПрдбреЗрдкреНрдЯрд░ ( bench_from_iter ) рдФрд░ scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реЛ рдЧрдПред рдЗрд╕рд▓рд┐рдП scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд╣реБрдЖ рд╣реИред

  • рд▓реЗрдХрд┐рди рдлрд┐рд░ 1.19 рдФрд░ 1.20 рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдмрд╣реБрдд рдкреАрдЫреЗ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ filter_map рдФрд░ scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдм рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬ рдереЗ:

rustc 1.20.0 (f3d6973f4 2017-08-27)

running 4 tests
test bench_from_iter                         ... bench:       2,274 ns/iter (+/- 54)
test bench_from_iter_with_filter_map         ... bench:       1,793 ns/iter (+/- 14)
test bench_from_iter_with_scan_passing_state ... bench:       1,716 ns/iter (+/- 7)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,716 ns/iter (+/- 26)
  • 1.22 рдФрд░ 1.23 рдХреЗ рдмреАрдЪ, scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕реНрдерд┐рд░ рд░рд╣реЗ:
rustc 1.23.0 (766bd11c8 2018-01-01)

running 4 tests
test bench_from_iter                         ... bench:       2,238 ns/iter (+/- 2)
test bench_from_iter_with_filter_map         ... bench:       1,755 ns/iter (+/- 6)
test bench_from_iter_with_scan_passing_state ... bench:       3,506 ns/iter (+/- 6)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,508 ns/iter (+/- 2)
  • рдлрд┐рд░ 1.23 рдФрд░ 1.24 рдХреЗ рдмреАрдЪ, filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдм рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбрд┐рдЧреНрд░реА рд╕реЗ bench_from_iter рдХреЛ рдкреАрдЫреЗ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд░рд╣рд╛ рдерд╛ред
rustc 1.24.0 (4d90ac38c 2018-02-12)

running 4 tests
test bench_from_iter                         ... bench:       2,323 ns/iter (+/- 8)
test bench_from_iter_with_filter_map         ... bench:       2,535 ns/iter (+/- 4)
test bench_from_iter_with_scan_passing_state ... bench:       3,796 ns/iter (+/- 15)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,792 ns/iter (+/- 11)
  • 1.26 рдФрд░ 1.27 рдХреЗ рдмреАрдЪ filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛, рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг:
rustc 1.27.0 (3eda71b00 2018-06-19)

running 4 tests
test bench_from_iter                         ... bench:       2,442 ns/iter (+/- 5)
test bench_from_iter_with_filter_map         ... bench:       5,080 ns/iter (+/- 55)
test bench_from_iter_with_scan_passing_state ... bench:       3,594 ns/iter (+/- 12)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,591 ns/iter (+/- 2)


рддреЛ: рдпрд╣ рдХрджрдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдХреА рдмрдбрд╝реА рдХрд╣рд╛рдиреА рдХреЛ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рддреА рд╣реИ: рдпреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ 1.13 рд╕реЗ рдиреАрдЪреЗ рдЧрдП:

rustc 1.13.0 (2c6933acc 2016-11-07)

running 4 tests
test bench_from_iter                         ... bench:       1,691 ns/iter (+/- 9)
test bench_from_iter_with_filter_map         ... bench:       1,930 ns/iter (+/- 230)
test bench_from_iter_with_scan_passing_state ... bench:       1,682 ns/iter (+/- 10)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,686 ns/iter (+/- 55)

рдЗрд╕рдХреЗ рд▓рд┐рдП 1.27 рдХреЗ рддрд╣рдд:

rustc 1.27.0 (3eda71b00 2018-06-19)

running 4 tests
test bench_from_iter                         ... bench:       2,442 ns/iter (+/- 5)
test bench_from_iter_with_filter_map         ... bench:       5,080 ns/iter (+/- 55)
test bench_from_iter_with_scan_passing_state ... bench:       3,594 ns/iter (+/- 12)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,591 ns/iter (+/- 2)

рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рдФрд░ рд╕рд╛рдкреЗрдХреНрд╖ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рдореМрдХрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЙрдкрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рднреНрд░рдорд┐рдд рдХрд╛рд░рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреНрд░рдорд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдЙрди рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХ рдЧрдпрд╛ рд╣реВрдВред)

рд╕рднреА 28 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЕрдирдмреЙрдХреНрд╕реНрдб рдХреНрд▓реЛрдЬрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдЕрдирдмреЙрдХреНрд╕реНрдб рдХреНрд▓реЛрдЬрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ?

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдореВрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ ред

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдбреЗрдкреНрдЯрд░ рдЗрдЯрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХреЗрд╡рд▓ scan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдХреАред рдореИрдВрдиреЗ filter_map рд╕рд╛рде рдПрдХ рднреА рдЬреЛрдбрд╝рд╛, рдмрд╕ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЪрд▓реЗрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереА рдХрд┐ рд╡реЗ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди:

running 3 tests
test bench_from_iter                 ... bench:       6,991 ns/iter (+/- 941)
test bench_from_iter_with_filter_map ... bench:       8,324 ns/iter (+/- 1,320)
test bench_from_iter_with_scan       ... bench:       7,299 ns/iter (+/- 1,172)

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдбреЗрдкреНрдЯрд░ рдЗрдЯрд░реЗрдЯрд░ рдЕрднреА рднреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

@shepmaster рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ v рд╕реНрд░реЛрдд рд╡реИрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдЕрддреНрдпрдзрд┐рдХ рдЕрд╕реНрдерд┐рд░ рд╣реИрдВ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рд╣рд░ рдмрд╛рд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдЬреЗрддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрдВрддрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

https://gist.github.com/dotdash/5ce3f0bfa2e652ca58b5 рдкрд░ рдмреЗрд╣рддрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ - рдореИрдВрдиреЗ рдмрд╕ рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ iter().cloned() рдмрдЬрд╛рдп into_iter() ред рдЪреВрдВрдХрд┐ рд╡реИрдХреНрдЯрд░ i32 рдорд╛рдиреЛрдВ рд╕реЗ рдмрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ,

рдкрд░рд┐рдгрд╛рдо:

test bench_from_iter                 ... bench:       2,304 ns/iter (+/- 23)
test bench_from_iter_with_filter_map ... bench:       4,996 ns/iter (+/- 122)
test bench_from_iter_with_scan       ... bench:       3,071 ns/iter (+/- 33)

рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ v рд╕реНрд░реЛрдд рд╡реИрдХреНрдЯрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд▓рдЧрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВ

рд╣рд╛рдБ, рдореБрдЭреЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореИрдВрдиреЗ рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрд╛ рдХрд┐ рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╣реА рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд▓рдЧрд╛рддрд╛рд░ рдмрд╛рд╣рд░ рдЖрдПрдВрдЧреЗред рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ (~5) рд░рдиреЛрдВ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рди рд╡рд┐рдЬреЗрддрд╛ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рднреЗрдЬ рджрд┐рдпрд╛! :-)

рдЗрд╕реЗ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рд░рд╛рдд рдореЗрдВ рдмреЗрд╣рддрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо:

running 3 tests
test bench_from_iter                 ... bench:       2,158 ns/iter (+/- 24)
test bench_from_iter_with_filter_map ... bench:       2,474 ns/iter (+/- 89)
test bench_from_iter_with_scan       ... bench:       2,145 ns/iter (+/- 35)

рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ FIXME рд╣реИ,
https://github.com/rust-lang/rust/blob/master/src/libcore/option.rs#L1092
https://github.com/rust-lang/rust/blob/master/src/libcore/result.rs#L1117
рдХреНрдпрд╛ рдпрд╣ рдЕрдм рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ FIXME рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ scan рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рд╢реВрдиреНрдп рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪреВрдВрдХрд┐ Scan рдЕрдм state рдХреЛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпреЗ FIXME s рднреА рд╢реВрдиреНрдп рд╣реИрдВ - рдореБрдЭреЗ scan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди FromIterator рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ scan ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ scan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛; рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ, рддреЛ рдореИрдВ FIXME рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП рдПрдХ рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ред

  • рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ scan рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдпрд╣ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╕рдВрдЪрд┐рдд рдореВрд▓реНрдп state рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрдХреИрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд┐рд░реЛрдпрд╛ рдЧрдпрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреИрди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕ state рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @ljedrz рдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
  • рдореИрдВ рдХреНрдпрд╛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рд░рдг FIXME рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ scan рдпрд╣рд╛рдБ рдХреА рд╡рдЬрд╣ рд╕реЗ рдкрд┐рд░реЛрдпрд╛ рдирд╣реАрдВ рд╣реИ state рдкреИрд░рд╛рдореАрдЯрд░, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХрд┐ scan , рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреИрд╕реЗ fold , рджрд┐рдП рдЧрдП iter рд╕реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЬрд▓реНрджреА рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ FromIterator рд▓рд┐рдП Option рдФрд░ Result рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдкрдбреЗрдЯ: рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рддреЗ рд╣реБрдП, @erickt , @shepmaster рдФрд░ @dotdash рдиреЗ рд╕рднреА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреНрд░рджрд╛рди рдХрд┐рдП рд╣реИрдВ рдЬреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ FromIterator рд▓рд┐рдП Result рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ scan FromIterator рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред (рдФрд░ Option рд╕рдорд╛рди рд╣реИред)

(рдпрд╛ рд╢рд╛рдпрдж try_fold рдпрд╣рд╛рдВ scan рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реЛрдЧрд╛) ((рдирд╣реАрдВ рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛))

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП @dotdash -provided рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░ 2x рдХреА рдордВрджреА

(рдФрд░ рдЕрдм рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдордВрджреА рдирд╣реАрдВ рдереА ...)

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реБрдЖ, рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗред (рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред)

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ ( details рдмреНрд▓реЙрдХ рдореЗрдВ):

  • рдореИрдВрдиреЗ рдбреЙрдЯрдбреИрд╢-рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓рд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ bench_from_iter_with_scan рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдП: рдПрдХ рдЬреЛ @dotdash рдХреЗ рдкрд╛рд╕ рдерд╛ рд╡рд╣ рд╣реИ bench_from_iter_with_scan_passing_state , рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдмрдирд╛рдпрд╛ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдПрдХ рдлреНрд░реА-рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ () рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдХреНрдд-рдЪрд░ рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ-рдкреИрд░рд╛рдореАрдЯрд░ рд╢реИрд▓реА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред
  • рдпрд╣рд╛рдБ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ: https://gist.github.com/pnkfelix/7cb66d32c3cd9e1f2ea1a61ef15a0a3a
  • рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ 1.13 рд╕реЗ 1.33 рддрдХ рдбреЙрдЯрдбреИрд╢-рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдпрд╛ ( #![feature(test)] рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП RUSTC_BOOTSTRAP=1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
  • рдореИрдВрдиреЗ рдЗрд╕ рд╢реЗрд▓ рдЖрдордВрддреНрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкрд╛рдВрдЪ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛:
% for VERSION in 1.{13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33}.0 ; do (\
  echo $VERSION && rustup update $VERSION && rustc +$VERSION --version && \
  RUSTC_BOOTSTRAP=1 rustc +$VERSION -C opt-level=3  --test main-bench.rs && \
   ./main-bench --bench && ./main-bench --bench && ./main-bench --bench && ./main-bench --bench && ./main-bench --bench \
) ; done | tee version-bench.txt
  • рдкреВрд░рд╛ рд▓реЙрдЧ рдЗрд╕ рд╕рд╛рд░ рдкрд░ рд╣реИ: https://gist.github.com/2db1e313af68ad6936a3da28c0c272f5
  • рдореИрдВрдиреЗ рд╕реНрдкреНрд░реИрдбрд╢реАрдЯ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдФрд╕рдд рдирд┐рдХрд╛рд▓рд╛ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдФрд╕рдд рдХреЗ рдмрдЬрд╛рдп рдиреНрдпреВрдирддрдо рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ), рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдкрд╖реНрдЯ-рдПрдбреЗрдкреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрд╛ рдЖрдзрд╛рд░рд┐рдд рдПрдХред
  • рдЬрдмрдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдФрд╕рдд рд▓рд┐рдпрд╛, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдкрд╛рда рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрд╕ рд╕рд╛рд░ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкрдХрдбрд╝рд╛ рдЬреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЧрдП рдФрд╕рдд рдХреЗ рд╕рдорд╛рди рд╣реИред

рдЕрд╡рд▓реЛрдХрди ( details рдмреНрд▓реЙрдХ рдореЗрдВ):

  • рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ 1.13 рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ (рдпрд╛рдиреА рдкреБрд░рд╛рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЗ рд▓рд┐рдП scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ (рдФрд░ filter_map рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдзреАрдорд╛) . рдпрд╣ 2016 рд╕реЗ @pmarcelll рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ 1.33 (рдореЗрд░реЗ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░) рд╕реЗ рдПрдХ рдирдореВрдирд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
rustc 1.13.0 (2c6933acc 2016-11-07)

running 4 tests
test bench_from_iter                         ... bench:       1,691 ns/iter (+/- 9)
test bench_from_iter_with_filter_map         ... bench:       1,930 ns/iter (+/- 230)
test bench_from_iter_with_scan_passing_state ... bench:       1,682 ns/iter (+/- 10)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,686 ns/iter (+/- 55)
  • 1.14 рдФрд░ 1.15 рдХреЗ рдмреАрдЪ, filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ, рд▓реЗрдХрд┐рди scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖-рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд░рд╣рд╛ред

  • 1.18 рдФрд░ 1.19 рдХреЗ рдмреАрдЪ, рд╕реНрдкрд╖реНрдЯ-рдПрдбреЗрдкреНрдЯрд░ ( bench_from_iter ) рдФрд░ scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реЛ рдЧрдПред рдЗрд╕рд▓рд┐рдП scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд╣реБрдЖ рд╣реИред

  • рд▓реЗрдХрд┐рди рдлрд┐рд░ 1.19 рдФрд░ 1.20 рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдмрд╣реБрдд рдкреАрдЫреЗ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ filter_map рдФрд░ scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдм рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬ рдереЗ:

rustc 1.20.0 (f3d6973f4 2017-08-27)

running 4 tests
test bench_from_iter                         ... bench:       2,274 ns/iter (+/- 54)
test bench_from_iter_with_filter_map         ... bench:       1,793 ns/iter (+/- 14)
test bench_from_iter_with_scan_passing_state ... bench:       1,716 ns/iter (+/- 7)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,716 ns/iter (+/- 26)
  • 1.22 рдФрд░ 1.23 рдХреЗ рдмреАрдЪ, scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕реНрдерд┐рд░ рд░рд╣реЗ:
rustc 1.23.0 (766bd11c8 2018-01-01)

running 4 tests
test bench_from_iter                         ... bench:       2,238 ns/iter (+/- 2)
test bench_from_iter_with_filter_map         ... bench:       1,755 ns/iter (+/- 6)
test bench_from_iter_with_scan_passing_state ... bench:       3,506 ns/iter (+/- 6)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,508 ns/iter (+/- 2)
  • рдлрд┐рд░ 1.23 рдФрд░ 1.24 рдХреЗ рдмреАрдЪ, filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдм рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбрд┐рдЧреНрд░реА рд╕реЗ bench_from_iter рдХреЛ рдкреАрдЫреЗ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд░рд╣рд╛ рдерд╛ред
rustc 1.24.0 (4d90ac38c 2018-02-12)

running 4 tests
test bench_from_iter                         ... bench:       2,323 ns/iter (+/- 8)
test bench_from_iter_with_filter_map         ... bench:       2,535 ns/iter (+/- 4)
test bench_from_iter_with_scan_passing_state ... bench:       3,796 ns/iter (+/- 15)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,792 ns/iter (+/- 11)
  • 1.26 рдФрд░ 1.27 рдХреЗ рдмреАрдЪ filter_map -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛, рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг:
rustc 1.27.0 (3eda71b00 2018-06-19)

running 4 tests
test bench_from_iter                         ... bench:       2,442 ns/iter (+/- 5)
test bench_from_iter_with_filter_map         ... bench:       5,080 ns/iter (+/- 55)
test bench_from_iter_with_scan_passing_state ... bench:       3,594 ns/iter (+/- 12)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,591 ns/iter (+/- 2)


рддреЛ: рдпрд╣ рдХрджрдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдХреА рдмрдбрд╝реА рдХрд╣рд╛рдиреА рдХреЛ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рддреА рд╣реИ: рдпреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ 1.13 рд╕реЗ рдиреАрдЪреЗ рдЧрдП:

rustc 1.13.0 (2c6933acc 2016-11-07)

running 4 tests
test bench_from_iter                         ... bench:       1,691 ns/iter (+/- 9)
test bench_from_iter_with_filter_map         ... bench:       1,930 ns/iter (+/- 230)
test bench_from_iter_with_scan_passing_state ... bench:       1,682 ns/iter (+/- 10)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,686 ns/iter (+/- 55)

рдЗрд╕рдХреЗ рд▓рд┐рдП 1.27 рдХреЗ рддрд╣рдд:

rustc 1.27.0 (3eda71b00 2018-06-19)

running 4 tests
test bench_from_iter                         ... bench:       2,442 ns/iter (+/- 5)
test bench_from_iter_with_filter_map         ... bench:       5,080 ns/iter (+/- 55)
test bench_from_iter_with_scan_passing_state ... bench:       3,594 ns/iter (+/- 12)
test bench_from_iter_with_scan_with_freevar  ... bench:       3,591 ns/iter (+/- 2)

рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рдФрд░ рд╕рд╛рдкреЗрдХреНрд╖ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рдореМрдХрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЙрдкрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рднреНрд░рдорд┐рдд рдХрд╛рд░рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреНрд░рдорд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдЙрди рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХ рдЧрдпрд╛ рд╣реВрдВред)

рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдиреЛрдЯ рдХрд┐рдП рдЧрдП рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдирд┐рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреА-рдЙрдЪреНрдЪ рдореБрджреНрджрд╛ рдмрдирд╛рдирд╛ред

(рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЕрдкрдиреЗ рдЕрд▓рдЧ рдореБрджреНрджреЗ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ, рдореИрдВ рдердХ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ рдЯреИрдЧрд┐рдВрдЧ рдФрд░ рдЦреБрдж рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд░рдбрд╛рд░ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд░рд╛рд╢рд┐ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред )

@pnkfelix рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

perf рдЗрд╕реЗ рдореЗрд░реЗ рдкреБрд░рд╛рдиреЗ bench_from_iter_with_scan рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  0.09 тФВ       movaps 0x20(%rsp),%xmm0
 34.33 тФВ       movups %xmm0,(%r15)
  5.85 тФВ       movups (%r15),%xmm0
 49.67 тФВ       movaps %xmm0,0x20(%rsp)

рдЬреЛ рдХрд╛рдлреА рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИред

rustc -O --test рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд:

running 3 tests
test bench_from_iter                 ... bench:       2,170 ns/iter (+/- 20)
test bench_from_iter_with_filter_map ... bench:       3,412 ns/iter (+/- 67)
test bench_from_iter_with_scan       ... bench:       4,416 ns/iter (+/- 40)

rustc -O --test -Ccodegen-units=1 рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд:

running 3 tests
test bench_from_iter                 ... bench:         977 ns/iter (+/- 18)
test bench_from_iter_with_filter_map ... bench:       3,296 ns/iter (+/- 36)
test bench_from_iter_with_scan       ... bench:       2,280 ns/iter (+/- 40)

@dotdash рдпрд╣рд╛рдБ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ: https://gist.github.com/pnkfelix/7cb66d32c3cd9e1f2ea1a61ef15a0a3a

рдареАрдХ; рдореИрдВ codegen-units рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ -C opt-level=3 рдХреЛ codegen-units рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд╡рд╛рдкрд╕ 1 рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? рдмрд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ ...)

--test -C opt-level=3 -C codegen-units= 1 рдХреЗ рд╕рд╛рде рдореЗрд░реА linux рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо:

rustc 1.33.0 (2aa4c46cf 2019-02-28)

running 4 tests
test bench_from_iter                         ... bench:       1,432 ns/iter (+/- 44)
test bench_from_iter_with_filter_map         ... bench:       1,504 ns/iter (+/- 3)
test bench_from_iter_with_scan_passing_state ... bench:       2,088 ns/iter (+/- 4)
test bench_from_iter_with_scan_with_freevar  ... bench:       2,050 ns/iter (+/- 12)
rustc 1.13.0 (2c6933acc 2016-11-07)

running 4 tests
test bench_from_iter                         ... bench:       1,688 ns/iter (+/- 50)
test bench_from_iter_with_filter_map         ... bench:       1,953 ns/iter (+/- 10)
test bench_from_iter_with_scan_passing_state ... bench:       1,677 ns/iter (+/- 62)
test bench_from_iter_with_scan_with_freevar  ... bench:       1,683 ns/iter (+/- 17)

рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрддрд╛рд╡рдиреА рдореИрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛: рдЬрдм рдореИрдВ рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЧрдП рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд░рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣рд╛рд░реНрдиреЗрд╕ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдХрд╛рд░рдХреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЪрд┐рдВрддрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВрдиреЗ bench_from_iter рджреЛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдП (рдПрдХ рдПрдбреЗрдкреНрдЯрд░-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрд┐рдд рдЗрдирд▓рд╛рдЗрди ( bench_from_iter_using_adapter ) рдХреЗ рд╕рд╛рде, рдФрд░ рджреВрд╕рд░рд╛ рдЬреЛ stdlib рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( bench_from_iter_using_baseline )), рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ , рдФрд░ рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ:

12-45-10 Mozilla/issue11084 % rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench
12-45-45 Mozilla/issue11084 % ./main-bench --bench

running 5 tests
test bench_from_iter_using_adapter____ ... bench:       1,531 ns/iter (+/- 6)
test bench_from_iter_using_baseline___ ... bench:       1,277 ns/iter (+/- 10)
test bench_from_iter_with_filter_map__ ... bench:       3,508 ns/iter (+/- 64)
test bench_from_iter_with_scan_freevar ... bench:       2,066 ns/iter (+/- 53)
test bench_from_iter_with_scan_param__ ... bench:       2,055 ns/iter (+/- 30)

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out

12-45-51 Mozilla/issue11084 % ./main-bench --bench

running 5 tests
test bench_from_iter_using_adapter____ ... bench:       1,514 ns/iter (+/- 6)
test bench_from_iter_using_baseline___ ... bench:       1,305 ns/iter (+/- 12)
test bench_from_iter_with_filter_map__ ... bench:       3,491 ns/iter (+/- 56)
test bench_from_iter_with_scan_freevar ... bench:       2,061 ns/iter (+/- 5)
test bench_from_iter_with_scan_param__ ... bench:       2,094 ns/iter (+/- 53)

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out

12-45-53 Mozilla/issue11084 % ./main-bench --bench adapter

running 1 test
test bench_from_iter_using_adapter____ ... bench:       1,574 ns/iter (+/- 12)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 4 filtered out

12-45-57 Mozilla/issue11084 % ./main-bench --bench adapter

running 1 test
test bench_from_iter_using_adapter____ ... bench:       1,530 ns/iter (+/- 9)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 4 filtered out

12-45-59 Mozilla/issue11084 % ./main-bench --bench baseline

running 1 test
test bench_from_iter_using_baseline___ ... bench:       1,569 ns/iter (+/- 9)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 4 filtered out

12-46-01 Mozilla/issue11084 % ./main-bench --bench baseline

running 1 test
test bench_from_iter_using_baseline___ ... bench:       1,576 ns/iter (+/- 4)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 4 filtered out

12-46-03 Mozilla/issue11084 %

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ bench_from_iter_using_baseline рд▓рд┐рдП рд╕рдордп [1277, 1305] рд╕реЗ рдмрдврд╝рдХрд░ [1569, 1576] рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЕрдиреНрдп рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдХреНрд░рдо рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдпрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗред рдпреЗ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрд╛рддрд╛рд░ рджреЛрд╣рд░рд╛рдП рдЧрдП рд░рдиреЛрдВ рдкрд░ рдХрд╛рдлреА рд╕реБрд╕рдВрдЧрдд рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреИрд╢ рдкреНрд░рднрд╛рд╡ рдпрд╛ рдореЗрдореЛрд░реА-рдЖрд╡рдВрдЯрдХ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдмреНрд▓реАрдб рдХрд░рдиреЗ рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣реА рд╣реИрдВред

(рдЗрд╕рдХреЗ рдмрджрд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреМрди рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЪрд┐рдВрддрд╛рдЬрдирдХ рдорд╛рдирддрд╛ рд╣реВрдВред рд╡рд╣, рдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреИрд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред)

(рдЙрдкрд░реЛрдХреНрдд рдХреБрдЫ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЗрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ Vec рдореЗрдВ рдЬрдорд╛ рди рд╣реЛ; рдЙрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореВрд▓ рдХреЛрдб рдорд╛рдкрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо FromIterator рдХреЛ Result рдФрд░ Option рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? )

рдареАрдХ рд╣реИ, рддреЛ рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рд▓рдХреНрд╖реНрдп рдкреНрд░рдХрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдХреЛрдб рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ Last<T> рдХреЗ рд▓рд┐рдП FromIterator ред рдпрд╣ рдХреЗрд╡рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ ( .last() рдорд╛рдзреНрдпрдо рд╕реЗ), рдЗрд╕рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рдвреЗрд░ рдкреНрд░рдмрдВрдзрди рд╕реЗ рдХреЛрдИ рд╢реЛрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ рдХреЛрдИ рдореЗрдо-рдПрдордЬреАрдПрдордЯреА рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрдирдкреБрдЯ рдЖрдХрд╛рд░ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдПрдирдПрд╕/рдЗрдЯрд░ рдЕрднреА рднреА рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛред)

https://gist.github.com/80fe57277434ef31f018c08fa8e21f84

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ FromIterator рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ: Last<T> рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдкрд╛ рдЧрдпрд╛ ns/iter рд╕реНрдерд┐рд░ рд▓рдЧрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдЪрд▓рд╛рдКрдВ рдпрд╛ рд╕рдордЧреНрд░ рд╕реВрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ; Vec<T> рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛ред

рдЗрд╕рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:

% RUSTC_BOOTSTRAP=1 rustc +1.13.0 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,692 ns/iter (+/- 8)
test bench__vec_from_iter_using_baseline___ ... bench:       1,692 ns/iter (+/- 67)
test bench__vec_from_iter_with_filter_map__ ... bench:       1,963 ns/iter (+/- 10)
test bench__vec_from_iter_with_scan_freevar ... bench:       1,692 ns/iter (+/- 11)
test bench__vec_from_iter_with_scan_param__ ... bench:       1,690 ns/iter (+/- 8)
test bench_last_from_iter_using_adapter____ ... bench:       2,156 ns/iter (+/- 10)
test bench_last_from_iter_using_baseline___ ... bench:       2,158 ns/iter (+/- 8)
test bench_last_from_iter_with_filter_map__ ... bench:       3,022 ns/iter (+/- 8)
test bench_last_from_iter_with_scan_freevar ... bench:       2,156 ns/iter (+/- 12)
test bench_last_from_iter_with_scan_param__ ... bench:       2,155 ns/iter (+/- 6)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured

% RUSTC_BOOTSTRAP=1 rustc +1.33.0 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,211 ns/iter (+/- 3)
test bench__vec_from_iter_using_baseline___ ... bench:       1,280 ns/iter (+/- 4)
test bench__vec_from_iter_with_filter_map__ ... bench:       1,504 ns/iter (+/- 4)
test bench__vec_from_iter_with_scan_freevar ... bench:       2,088 ns/iter (+/- 61)
test bench__vec_from_iter_with_scan_param__ ... bench:       2,054 ns/iter (+/- 5)
test bench_last_from_iter_using_adapter____ ... bench:       2,186 ns/iter (+/- 5)
test bench_last_from_iter_using_baseline___ ... bench:       2,186 ns/iter (+/- 19)
test bench_last_from_iter_with_filter_map__ ... bench:       1,659 ns/iter (+/- 12)
test bench_last_from_iter_with_scan_freevar ... bench:       2,692 ns/iter (+/- 2)
test bench_last_from_iter_with_scan_param__ ... bench:       2,693 ns/iter (+/- 3)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

% RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,270 ns/iter (+/- 53)
test bench__vec_from_iter_using_baseline___ ... bench:       1,265 ns/iter (+/- 54)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,469 ns/iter (+/- 7)
test bench__vec_from_iter_with_scan_freevar ... bench:       2,076 ns/iter (+/- 1)
test bench__vec_from_iter_with_scan_param__ ... bench:       2,128 ns/iter (+/- 47)
test bench_last_from_iter_using_adapter____ ... bench:       2,186 ns/iter (+/- 5)
test bench_last_from_iter_using_baseline___ ... bench:       2,185 ns/iter (+/- 57)
test bench_last_from_iter_with_filter_map__ ... bench:       2,650 ns/iter (+/- 13)
test bench_last_from_iter_with_scan_freevar ... bench:       2,678 ns/iter (+/- 12)
test bench_last_from_iter_with_scan_param__ ... bench:       2,674 ns/iter (+/- 15)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

рдЗрд╕рд▓рд┐рдП: рдЬрдм рдЖрдк scan -рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдПрдбреЗрдкреНрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдХреБрдЫ рдкреНрд░рддрд┐рдЧрдорди рд╣реЛрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ Last<T> рдмрдЬрд╛рдп Vec<T> , рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ: рдордВрджреА Last<T> рд▓рд┐рдП 1.22x рдХрд╛ рдХрд╛рд░рдХ рд╣реИ ( Vec<T> рд▓рд┐рдП 1.67x рдХреА рддрд░рд╣ рдХреБрдЫ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)ред

рдпрд╣рд╛рдБ @pnkfelix рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИ рдЬреЛ рд╡рд┐рдЪрд░рдг ( рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ ) рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред

graph

рдлрд┐рд░ рдХрд┐рд╕реА рдиреЗ рдЬрд╛рдХрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рддреЛ рдпрд╣ рдЕрдм рдФрд░ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...

рдлрд┐рд░ рдХрд┐рд╕реА рдиреЗ рдЬрд╛рдХрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ рдмрджрд▓реЗ

(рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рд╡рд╣ рдирдП рд░реВрдкреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рдерд╛; рдореВрд▓ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЕрднреА рднреА рд╡рд╣рд╛рдВ рд╣реИрдВ ...)

рдЕрдкрдбреЗрдЯ: рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ Vec -рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ Last -рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?

рдЖрд╣ рдпрд╣рд╛рдБ рдПрдХ рдЖрдЦрд┐рд░реА рд░рди рд╣реИ: @eddyb рдХреЗ рдПрдХ рдиреЛрдЯ рдиреЗ рдХрд╣реАрдВ рдФрд░ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреЛрдбрдЬреЗрди-рдпреВрдирд┐рдЯреНрд╕ = 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП -C lto=... рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

lto=off (рдХреЛрдбрдЬрди-рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рдорд╛рди = 1)

% RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench -C lto=off  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,260 ns/iter (+/- 6)
test bench__vec_from_iter_using_baseline___ ... bench:       1,306 ns/iter (+/- 48)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,467 ns/iter (+/- 3)
test bench__vec_from_iter_with_scan_freevar ... bench:       2,082 ns/iter (+/- 12)
test bench__vec_from_iter_with_scan_param__ ... bench:       2,087 ns/iter (+/- 52)
test bench_last_from_iter_using_adapter____ ... bench:       2,186 ns/iter (+/- 6)
test bench_last_from_iter_using_baseline___ ... bench:       2,187 ns/iter (+/- 21)
test bench_last_from_iter_with_filter_map__ ... bench:       2,650 ns/iter (+/- 3)
test bench_last_from_iter_with_scan_freevar ... bench:       2,683 ns/iter (+/- 4)
test bench_last_from_iter_with_scan_param__ ... bench:       2,688 ns/iter (+/- 8)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

рдПрд▓рдЯреАрдУ = рд╡рд╕рд╛

% RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench -C lto=fat  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,289 ns/iter (+/- 19)
test bench__vec_from_iter_using_baseline___ ... bench:       1,232 ns/iter (+/- 9)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,481 ns/iter (+/- 19)
test bench__vec_from_iter_with_scan_freevar ... bench:       1,273 ns/iter (+/- 20)
test bench__vec_from_iter_with_scan_param__ ... bench:       1,273 ns/iter (+/- 8)
test bench_last_from_iter_using_adapter____ ... bench:       1,680 ns/iter (+/- 18)
test bench_last_from_iter_using_baseline___ ... bench:       1,683 ns/iter (+/- 21)
test bench_last_from_iter_with_filter_map__ ... bench:       3,047 ns/iter (+/- 2)
test bench_last_from_iter_with_scan_freevar ... bench:       1,793 ns/iter (+/- 81)
test bench_last_from_iter_with_scan_param__ ... bench:       1,773 ns/iter (+/- 49)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

рдПрд▓рдЯреАрдУ = рдкрддрд▓рд╛

% RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=1 --test main-bench.rs -o main-bench -C lto=thin  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,263 ns/iter (+/- 8)
test bench__vec_from_iter_using_baseline___ ... bench:       1,238 ns/iter (+/- 49)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,702 ns/iter (+/- 32)
test bench__vec_from_iter_with_scan_freevar ... bench:       1,248 ns/iter (+/- 3)
test bench__vec_from_iter_with_scan_param__ ... bench:       1,248 ns/iter (+/- 13)
test bench_last_from_iter_using_adapter____ ... bench:       1,616 ns/iter (+/- 6)
test bench_last_from_iter_using_baseline___ ... bench:       1,612 ns/iter (+/- 6)
test bench_last_from_iter_with_filter_map__ ... bench:       3,024 ns/iter (+/- 7)
test bench_last_from_iter_with_scan_freevar ... bench:       1,427 ns/iter (+/- 7)
test bench_last_from_iter_with_scan_param__ ... bench:       1,427 ns/iter (+/- 11)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, lto (рд╡рд╕рд╛ рдпрд╛ рдкрддрд▓рд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ scan -рдкреНрд░рджрд░реНрд╢рди рдЙрд╕ рдЖрдзрд╛рд░ рд░реЗрдЦрд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░/рдпрд╛ рдХреЛрдбрдЬреЗрди-рдпреВрдирд┐рдЯ рд╡рд┐рднрд╛рдЬрди рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

рдФрд░ рдореИрдВ рдЗрд╕ рдЬрд╛рдВрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП FromIterator рд▓рд┐рдП Option рдФрд░ Result рдХреЗ рд╕рд░рд▓реАрдХреГрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред

рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рди рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдПрдВ рдЬрдм рдЖрдк lto рдмрджрд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ codegen-units тЙа 1 рд╣реИ:

lto=рдСрдл рдХреЛрдбрдЬрди-рдЗрдХрд╛рдЗрдпрд╛рдБ=16

11-54-00 Mozilla/issue11084 % RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=16 --test main-bench.rs -o main-bench -C lto=off  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       6,830 ns/iter (+/- 66)
test bench__vec_from_iter_using_baseline___ ... bench:       6,848 ns/iter (+/- 30)
test bench__vec_from_iter_with_filter_map__ ... bench:       5,547 ns/iter (+/- 20)
test bench__vec_from_iter_with_scan_freevar ... bench:       5,592 ns/iter (+/- 84)
test bench__vec_from_iter_with_scan_param__ ... bench:       5,322 ns/iter (+/- 12)
test bench_last_from_iter_using_adapter____ ... bench:       9,820 ns/iter (+/- 216)
test bench_last_from_iter_using_baseline___ ... bench:      14,730 ns/iter (+/- 116)
test bench_last_from_iter_with_filter_map__ ... bench:       9,869 ns/iter (+/- 16)
test bench_last_from_iter_with_scan_freevar ... bench:      11,351 ns/iter (+/- 131)
test bench_last_from_iter_with_scan_param__ ... bench:      10,593 ns/iter (+/- 51)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

lto=рд╡рд╕рд╛ рдХреЛрдбреЗрдЬрди-рдЗрдХрд╛рдЗрдпрд╛рдБ=16

11-54-19 Mozilla/issue11084 % RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=16 --test main-bench.rs -o main-bench -C lto=fat  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       1,914 ns/iter (+/- 12)
test bench__vec_from_iter_using_baseline___ ... bench:       1,914 ns/iter (+/- 2)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,406 ns/iter (+/- 10)
test bench__vec_from_iter_with_scan_freevar ... bench:       1,354 ns/iter (+/- 4)
test bench__vec_from_iter_with_scan_param__ ... bench:       1,340 ns/iter (+/- 7)
test bench_last_from_iter_using_adapter____ ... bench:       1,648 ns/iter (+/- 17)
test bench_last_from_iter_using_baseline___ ... bench:       1,607 ns/iter (+/- 11)
test bench_last_from_iter_with_filter_map__ ... bench:       8,309 ns/iter (+/- 23)
test bench_last_from_iter_with_scan_freevar ... bench:       1,648 ns/iter (+/- 8)
test bench_last_from_iter_with_scan_param__ ... bench:       1,648 ns/iter (+/- 14)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

lto=рдкрддрд▓реА рдХреЛрдбрдЬрди-рдЗрдХрд╛рдЗрдпрд╛рдБ=16

11-55-02 Mozilla/issue11084 % RUSTC_BOOTSTRAP=1 rustc +nightly-2019-03-20 -C opt-level=3 -C codegen-units=16 --test main-bench.rs -o main-bench -C lto=thin  && ./main-bench --bench

running 10 tests
test bench__vec_from_iter_using_adapter____ ... bench:       2,076 ns/iter (+/- 82)
test bench__vec_from_iter_using_baseline___ ... bench:       2,076 ns/iter (+/- 3)
test bench__vec_from_iter_with_filter_map__ ... bench:       3,792 ns/iter (+/- 11)
test bench__vec_from_iter_with_scan_freevar ... bench:       6,046 ns/iter (+/- 21)
test bench__vec_from_iter_with_scan_param__ ... bench:       6,064 ns/iter (+/- 46)
test bench_last_from_iter_using_adapter____ ... bench:       1,429 ns/iter (+/- 12)
test bench_last_from_iter_using_baseline___ ... bench:       1,501 ns/iter (+/- 21)
test bench_last_from_iter_with_filter_map__ ... bench:       8,945 ns/iter (+/- 91)
test bench_last_from_iter_with_scan_freevar ... bench:      15,404 ns/iter (+/- 15)
test bench_last_from_iter_with_scan_param__ ... bench:      15,385 ns/iter (+/- 17)

test result: ok. 0 passed; 0 failed; 0 ignored; 10 measured; 0 filtered out

рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдЧрдорди scan рдЖрдзрд╛рд░рд┐рдд рдЗрдЯрд░реЗрдЯрд░ рдЬрдм рдЖрдк codegen рдЗрдХрд╛рдЗрдпреЛрдВ рд╣реИ = 16 рдФрд░ LTO = рдкрддрд▓реА рд╕реБрдВрджрд░ рдбрд░рд╛рд╡рдирд╛ рд╣реИ (рдФрд░ рдпрд╣ рдбреЗрд╕реНрдХрдЯреЙрдк рдорд╢реАрди рдХреЗ рд▓рд┐рдП, codegen-units=16 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ) ... рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреНрд▓реЙрдХ рд▓реИрдВрдбрд┐рдВрдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди?

рдЕрдкрдбреЗрдЯ: @michaelwoerister рдиреЗ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдХреБрдЫ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрд▓рдЯреАрдУ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрд▓рдЯреАрдУ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред (рдЬреЛ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдирдВрдмрд░реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╢рд╛рдпрдж рдХреБрдЫ рдРрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдмреЗрд╕рд▓рд╛рдЗрди рдФрд░ рд╕реНрдХреИрди-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдХреЛрдбрдЬрди-рдЗрдХрд╛рдЗрдпрд╛рдБ = 16 рдЬрдм рдПрд▓рдЯреАрдУ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред (рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдЦреНрдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ -C lto рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред)

  • рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк -C lto _and_ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХрд╛рдзрд┐рдХ рдХреЛрдбрдЬрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рд╕реНрдерд╛рдиреАрдп рдерд┐рдирдПрд▓рдЯреАрдУ" рдирд╛рдордХ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдХреЛрдбрдЬрди рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ -C lto рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рднреА рдПрд▓рдЯреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

-C lto рдзреНрд╡рдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ "рд╕реНрдерд╛рдиреАрдп ThinLTO" рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдСрдкреНрдЯ рдЗрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЙрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрднреНрдпрд╕реНрдд рд╣реВрдВ рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд▓рдЭрди рдореЗрдВ рдерд╛, рдФрд░ рдКрдкрд░ рдореЗрд░реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдХреБрдЫ рд╢реАрд░реНрд╖рдХ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ .

рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдиреЛрдЯ рдХрд┐рдП рдЧрдП рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдирд┐рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреА-рдЙрдЪреНрдЪ рдореБрджреНрджрд╛ рдмрдирд╛рдирд╛ред

рдареАрдХ рд╣реИ, рдореИрдВ рдЕрдкрдиреА рдЬрд╛рдВрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдкреА-рд▓реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред


рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдХреБрдЫ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдкреАрдЖрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ impl FromIterator рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдпрд╣рд╛рдВ рдореВрд▓ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рд▓рд┐рдП рдмреЗрдВрдЪрдорд╛рд░реНрдХ рднреАред рд╡рд╣ рдкреАрдЖрд░ #59605 рдореЗрдВ рд╣реИред

рдФрд░ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрдорд╛рдВрдб UI рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рдПрд▓рдЯреАрдУ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ -C opt-level=3 рдЕрд░реНрде рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдбрдЬреЗрди-рдЗрдХрд╛рдЗрдпреЛрдВ = 1 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдбрдЬреЗрди-рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХреА рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдореБрдЭреЗ рдкреАрдЖрд░ #59605 рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рддрдм рддрдХ рдореИрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреВрдВрдЧрд╛ред

@pnkfelix рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

perf рдЗрд╕реЗ рдореЗрд░реЗ рдкреБрд░рд╛рдиреЗ bench_from_iter_with_scan рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реЙрдЯрд╕реНрдкреЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  0.09 тФВ       movaps 0x20(%rsp),%xmm0
 34.33 тФВ       movups %xmm0,(%r15)
  5.85 тФВ       movups (%r15),%xmm0
 49.67 тФВ       movaps %xmm0,0x20(%rsp)

рдЬреЛ рдХрд╛рдлреА рдкреНрд░рдлреБрд▓реНрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдХрдо рд▓рдЯрдХрд╛ рд╣реБрдЖ рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдФрд░ рдкреАрдЖрд░ #59605 рд╕реЗ рдЕрдирд┐рд░реНрдгрд╛рдпрдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zhendongsu picture zhendongsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tikue picture tikue  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cuviper picture cuviper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dnsl48 picture dnsl48  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ