рд╕реБрд╕рдВрдзреНрдпрд╛ред рдореИрдВ рдПрдХ рдЫреВрдЯреЗ рд╣реБрдП рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдореИрдВ std::result::collect
рдХреЛ FromIteratator
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореЗрд░реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ iter::Scan
, рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ --opt-level=3
рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╕рд╛рдмрд┐рдд рд╣реБрдЖред рдореИрдВрдиреЗ рдПрдХ рдХрд╕реНрдЯрдо рдЗрдЯрд░реЗрдЯрд░ рднреА рдмрдирд╛рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдореВрд▓ std::result::collect
рдХреЗ рд╕рдорд╛рди рдЧрддрд┐ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ llvm рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдПрдХ рд╕рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ Scan1::size_hint()
std::iter::Scan::size_hint()
рдкрджреНрдзрддрд┐ рд╕реЗ рднрд┐рдиреНрди рд╣реИред
cc @thestinger
рдХреНрдпрд╛ рдЕрдирдмреЙрдХреНрд╕реНрдб рдХреНрд▓реЛрдЬрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ?
рдХреНрдпрд╛ рдЕрдирдмреЙрдХреНрд╕реНрдб рдХреНрд▓реЛрдЬрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ?
рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдореВрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ ред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдбреЗрдкреНрдЯрд░ рдЗрдЯрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХреЗрд╡рд▓ 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 рдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред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
, рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдмрдирд╛рдпрд╛ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдПрдХ рдлреНрд░реА-рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕ ()
рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдХреНрдд-рдЪрд░ рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ-рдкреИрд░рд╛рдореАрдЯрд░ рд╢реИрд▓реА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред#![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
рдЕрд╡рд▓реЛрдХрди ( details
рдмреНрд▓реЙрдХ рдореЗрдВ):
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)
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)
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)
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 рдХреЗ рдореВрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИ рдЬреЛ рд╡рд┐рдЪрд░рдг ( рдирд┐рд░реНрдорд╛рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ ) рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред
рдлрд┐рд░ рдХрд┐рд╕реА рдиреЗ рдЬрд╛рдХрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рддреЛ рдпрд╣ рдЕрдм рдФрд░ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...
рдлрд┐рд░ рдХрд┐рд╕реА рдиреЗ рдЬрд╛рдХрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рддрд░реАрдХреЗ рдмрджрд▓реЗ
(рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рд╡рд╣ рдирдП рд░реВрдкреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд░рд╣рд╛ рдерд╛; рдореВрд▓ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЕрднреА рднреА рд╡рд╣рд╛рдВ рд╣реИрдВ ...)
рдЕрдкрдбреЗрдЯ: рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ Vec
-рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ Last
-рдмрд┐рд▓реНрдбрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛?
рдЖрд╣ рдпрд╣рд╛рдБ рдПрдХ рдЖрдЦрд┐рд░реА рд░рди рд╣реИ: @eddyb рдХреЗ рдПрдХ рдиреЛрдЯ рдиреЗ рдХрд╣реАрдВ рдФрд░ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреЛрдбрдЬреЗрди-рдпреВрдирд┐рдЯреНрд╕ = 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП -C lto=...
рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд┐рдВрдХ-рдЯрд╛рдЗрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
% 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 рд╣реИ:
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
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
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 рд╕реЗ рдЕрдирд┐рд░реНрдгрд╛рдпрдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдареАрдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реБрдЖ, рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗред (рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛ рд░рд╣реЗ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред)
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ (
details
рдмреНрд▓реЙрдХ рдореЗрдВ):bench_from_iter_with_scan
рджреЛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдП: рдПрдХ рдЬреЛ @dotdash рдХреЗ рдкрд╛рд╕ рдерд╛ рд╡рд╣ рд╣реИbench_from_iter_with_scan_passing_state
, рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╡реИрд░рд┐рдПрдВрдЯ рдмрдирд╛рдпрд╛ рдЬреЛ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдПрдХ рдлреНрд░реА-рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╕()
рдХрд░рддрд╛ рд╣реИ (рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрднреА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореБрдХреНрдд-рдЪрд░ рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ-рдкреИрд░рд╛рдореАрдЯрд░ рд╢реИрд▓реА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред#![feature(test)]
рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдПRUSTC_BOOTSTRAP=1
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)редрдЕрд╡рд▓реЛрдХрди (
details
рдмреНрд▓реЙрдХ рдореЗрдВ):scan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдерд╛ (рдФрд░filter_map
рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдзреАрдорд╛) . рдпрд╣ 2016 рд╕реЗ @pmarcelll рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ 1.33 (рдореЗрд░реЗ рд▓рд┐рдирдХреНрд╕ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░) рд╕реЗ рдПрдХ рдирдореВрдирд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:1.14 рдФрд░ 1.15 рдХреЗ рдмреАрдЪ,
filter_map
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ, рд▓реЗрдХрд┐рдиscan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖-рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд░рд╣рд╛ред1.18 рдФрд░ 1.19 рдХреЗ рдмреАрдЪ, рд╕реНрдкрд╖реНрдЯ-рдПрдбреЗрдкреНрдЯрд░ (
bench_from_iter
) рдФрд░scan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реЛ рдЧрдПред рдЗрд╕рд▓рд┐рдПscan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрдирд╛ рд╣реБрдЖ рд╣реИредрд▓реЗрдХрд┐рди рдлрд┐рд░ 1.19 рдФрд░ 1.20 рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдмрд╣реБрдд рдкреАрдЫреЗ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрд┐рд╕рд╕реЗ
filter_map
рдФрд░scan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдм рд╕реНрдкрд╖реНрдЯ-рдПрдбрд╛рдкреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рддреЗрдЬ рдереЗ:scan
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреАрдЫреЗ рд╣рдЯ рдЧрдпрд╛ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╕реНрдерд┐рд░ рд░рд╣реЗ:filter_map
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдЕрдм рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбрд┐рдЧреНрд░реА рд╕реЗbench_from_iter
рдХреЛ рдкреАрдЫреЗ рдирд╣реАрдВ рдЫреЛрдбрд╝ рд░рд╣рд╛ рдерд╛редfilter_map
-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛, рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг:рддреЛ: рдпрд╣ рдХрджрдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдХреА рдмрдбрд╝реА рдХрд╣рд╛рдиреА рдХреЛ рдореБрдЦреМрдЯрд╛ рдмрдирд╛рддреА рд╣реИ: рдпреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ 1.13 рд╕реЗ рдиреАрдЪреЗ рдЧрдП:
рдЗрд╕рдХреЗ рд▓рд┐рдП 1.27 рдХреЗ рддрд╣рдд:
рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдг рдФрд░ рд╕рд╛рдкреЗрдХреНрд╖ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреА рддрд░рд╣ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рдореМрдХрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЙрдкрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рднреНрд░рдорд┐рдд рдХрд╛рд░рдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдХреНрд░рдорд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣рд╛рдВ рдЙрди рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХ рдЧрдпрд╛ рд╣реВрдВред)