Josh Stone
c70cdc0ed4
Rollup merge of #59283 - SimonSapin:branchless-ascii-case, r=joshtriplett
...
Make ASCII case conversions more than 4× faster
Reformatted output of `./x.py bench src/libcore --test-args ascii` below. The `libcore` benchmark calls `[u8]::make_ascii_lowercase`. `lookup` has code (effectively) identical to that before this PR, and ~~`branchless`~~ `mask_shifted_bool_match_range` after this PR.
~~See [code comments](https://github.com/rust-lang/rust/pull/59283/commits/ce933f77c865a15670855ac5941fe200752b739f#diff-01076f91a26400b2db49663d787c2576R3796 ) in `u8::to_ascii_uppercase` in `src/libcore/num/mod.rs` for an explanation of the branchless algorithm.~~
**Update:** the algorithm was simplified while keeping the performance. See `branchless` v.s. `mask_shifted_bool_match_range` benchmarks.
Credits to @raphlinus for the idea in https://twitter.com/raphlinus/status/1107654782544736261 , which extends this algorithm to “fake SIMD” on `u32` to convert four bytes at a time. The `fake_simd_u32` benchmarks implements this with [`let (before, aligned, after) = bytes.align_to_mut::<u32>()`](https://doc.rust-lang.org/std/primitive.slice.html#method.align_to_mut ). Note however that this is buggy when addition carries/overflows into the next byte (which does not happen if the input is known to be ASCII).
This could be fixed (to optimize `[u8]::make_ascii_lowercase` and `[u8]::make_ascii_uppercase` in `src/libcore/slice/mod.rs`) either with some more bitwise trickery that I didn’t quite figure out, or by using “real” SIMD intrinsics for byte-wise addition. I did not pursue this however because the current (incorrect) fake SIMD algorithm is only marginally faster than the one-byte-at-a-time branchless algorithm. This is because LLVM auto-vectorizes the latter, as can be seen on https://rust.godbolt.org/z/anKtbR .
Benchmark results on Linux x64 with Intel i7-7700K: (updated from https://github.com/rust-lang/rust/pull/59283#issuecomment-474146863 )
```rust
6830 bytes string:
alloc_only ... bench: 112 ns/iter (+/- 0) = 62410 MB/s
black_box_read_each_byte ... bench: 1,733 ns/iter (+/- 8) = 4033 MB/s
lookup_table ... bench: 1,766 ns/iter (+/- 11) = 3958 MB/s
branch_and_subtract ... bench: 417 ns/iter (+/- 1) = 16762 MB/s
branch_and_mask ... bench: 401 ns/iter (+/- 1) = 17431 MB/s
branchless ... bench: 365 ns/iter (+/- 0) = 19150 MB/s
libcore ... bench: 367 ns/iter (+/- 1) = 19046 MB/s
fake_simd_u32 ... bench: 361 ns/iter (+/- 2) = 19362 MB/s
fake_simd_u64 ... bench: 361 ns/iter (+/- 1) = 19362 MB/s
mask_mult_bool_branchy_lookup_table ... bench: 6,309 ns/iter (+/- 19) = 1107 MB/s
mask_mult_bool_lookup_table ... bench: 4,183 ns/iter (+/- 29) = 1671 MB/s
mask_mult_bool_match_range ... bench: 339 ns/iter (+/- 0) = 20619 MB/s
mask_shifted_bool_match_range ... bench: 339 ns/iter (+/- 1) = 20619 MB/s
32 bytes string:
alloc_only ... bench: 15 ns/iter (+/- 0) = 2133 MB/s
black_box_read_each_byte ... bench: 29 ns/iter (+/- 0) = 1103 MB/s
lookup_table ... bench: 24 ns/iter (+/- 4) = 1333 MB/s
branch_and_subtract ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
branch_and_mask ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
branchless ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
libcore ... bench: 15 ns/iter (+/- 0) = 2133 MB/s
fake_simd_u32 ... bench: 17 ns/iter (+/- 0) = 1882 MB/s
fake_simd_u64 ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
mask_mult_bool_branchy_lookup_table ... bench: 42 ns/iter (+/- 0) = 761 MB/s
mask_mult_bool_lookup_table ... bench: 35 ns/iter (+/- 0) = 914 MB/s
mask_mult_bool_match_range ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
mask_shifted_bool_match_range ... bench: 16 ns/iter (+/- 0) = 2000 MB/s
7 bytes string:
alloc_only ... bench: 14 ns/iter (+/- 0) = 500 MB/s
black_box_read_each_byte ... bench: 22 ns/iter (+/- 0) = 318 MB/s
lookup_table ... bench: 16 ns/iter (+/- 0) = 437 MB/s
branch_and_subtract ... bench: 16 ns/iter (+/- 0) = 437 MB/s
branch_and_mask ... bench: 16 ns/iter (+/- 0) = 437 MB/s
branchless ... bench: 19 ns/iter (+/- 0) = 368 MB/s
libcore ... bench: 20 ns/iter (+/- 0) = 350 MB/s
fake_simd_u32 ... bench: 18 ns/iter (+/- 0) = 388 MB/s
fake_simd_u64 ... bench: 21 ns/iter (+/- 0) = 333 MB/s
mask_mult_bool_branchy_lookup_table ... bench: 20 ns/iter (+/- 0) = 350 MB/s
mask_mult_bool_lookup_table ... bench: 19 ns/iter (+/- 0) = 368 MB/s
mask_mult_bool_match_range ... bench: 19 ns/iter (+/- 0) = 368 MB/s
mask_shifted_bool_match_range ... bench: 19 ns/iter (+/- 0) = 368 MB/s
```
2019-03-27 18:15:25 -07:00
Josh Stone
e5fa59735b
Rollup merge of #59268 - estebank:from-string, r=QuietMisdreavus
...
Add suggestion to use `&*var` when `&str: From<String>` is expected
Fix #53879 .
2019-03-27 18:15:24 -07:00
Guillaume Gomez
616ee876c1
Rollup merge of #59427 - czipperz:non_null_doc_links, r=Mark-Simulacrum
...
Link to PhantomData in NonNull documentation
2019-03-26 22:26:45 +01:00
Guillaume Gomez
4e19b7a0e9
Rollup merge of #59330 - DevQps:improve-std-convert-documentation, r=steveklabnik
...
Improve the documentation for std::convert (From, Into, AsRef and AsMut)
# Description
In this PR I updated the documentation of From, Into, AsRef and AsMut, as well as the general std::convert module documentation. The discussion in #59163 provided information that was not yet present in the docs, or was not expressed clearly enough. I tried to clarify the examples that were already present in the docs as well as add more information about considered best-practices that came out of the discussion in #59163
@steveklabnik I hope I didn't change too much. This is an initial version! I will scan through everything tomorrow as well again to see if I made any typo's or errors, and maybe make some small changes here and there.
All suggestions are welcome!
closes #59163
2019-03-26 22:26:42 +01:00
bors
fbd34efb32
Auto merge of #59433 - Centril:rollup, r=Centril
...
Rollup of 10 pull requests
Successful merges:
- #59150 (Expand suggestions for type ascription parse errors)
- #59232 (Merge `Promoted` and `Static` in `mir::Place`)
- #59267 (Provide suggestion when using field access instead of path)
- #59315 (Add no_hash to query macro and move some queries over)
- #59334 (Update build instructions in README.md)
- #59362 (Demo `FromIterator` short-circuiting)
- #59374 (Simplify checked_duration_since)
- #59389 (replace redundant note in deprecation warning)
- #59410 (Clarify `{Ord,f32,f64}::clamp` docs a little)
- #59419 (Utilize `?` instead of `return None`.)
Failed merges:
r? @ghost
2019-03-26 17:25:16 +00:00
Mazdak Farrokhzad
0b46f0e649
bump bootstrap; adjust stage0 uses in core::ptr.
2019-03-26 09:57:25 +01:00
Mazdak Farrokhzad
822b4fcb3b
Rollup merge of #59419 - frewsxcv:frewsxcv-qu, r=varkor
...
Utilize `?` instead of `return None`.
None
2019-03-26 09:05:53 +01:00
Mazdak Farrokhzad
0677eb1eaa
Rollup merge of #59410 - tbu-:pr_doc_clarifyclamp, r=joshtriplett
...
Clarify `{Ord,f32,f64}::clamp` docs a little
Explicitly call out when it returns NaN, adhere to the panic doc
guidelines.
2019-03-26 09:05:52 +01:00
Mazdak Farrokhzad
0616b73c2f
Rollup merge of #59362 - pnkfelix:demo-from-iterator-short-circuiting, r=Centril
...
Demo `FromIterator` short-circuiting
while looking at a FIXME in `FromIterator for Option` and `FromIterator for Result`, I realized that the current documentation does not have example code showing exactly what is meant by "no further elements are taken."
The code snippets provided here are meant to correct that.
2019-03-26 09:05:47 +01:00
Corey Farwell
28c602a94e
Utilize ? instead of return None.
2019-03-25 23:29:49 +01:00
Chris Gregory
fd42918a41
Link to PhantomData in NonNull documentation
2019-03-25 18:04:42 -04:00
Christian
6c479c3d02
Formatting changes, including better wrapping and creating short summary lines.
2019-03-25 22:21:05 +01:00
Tobias Bucher
0bb36a2f90
Clarify {Ord,f32,f64}::clamp docs a little
...
Explicitly call out when it returns NaN, adhere to the panic doc
guidelines.
2019-03-25 12:52:42 +01:00
Felix S Klock II
0e83e96852
add missing braces
...
add missing braces analogous to those suggested by killercup
2019-03-25 11:50:11 +01:00
Pascal Hertleif
6315221b39
Update src/libcore/option.rs
...
Co-Authored-By: pnkfelix <pnkfelix@pnkfx.org>
2019-03-25 11:48:08 +01:00
kennytm
cb2dde63d5
Rollup merge of #59328 - koalatux:iter-nth-back, r=scottmcm
...
Implement specialized nth_back() for Box and Windows.
Hi there, this is my first pull request to rust :-)
I started implementing some specializations for DoubleEndedIterator::nth_back() and these are the first two. The problem has been discussed in #54054 and nth_back() is tracked in #56995 .
I'm stuck with the next implementation so I though I do a PR for the ones I'm confident with to get some feedback.
2019-03-24 19:00:10 +08:00
kennytm
48dc8efc85
Rollup merge of #59239 - gnzlbg:fix_spin_loop, r=nagisa
...
Remove inline assembly from hint::spin_loop
This PR removes the inline assembly which was not required since these
instructions are available in core::arch, and extends support of
the spin_loop hint to arm targets with the v6 feature which also
support the yield instruction.
2019-03-24 15:32:45 +08:00
Esteban Küber
e929d19edc
review comments
2019-03-22 21:54:19 -07:00
Esteban Küber
ac3290e8d9
Add suggestion to use &*var when &str: From<String> is expected
2019-03-22 20:38:14 -07:00
Mazdak Farrokhzad
225b6baae7
Rollup merge of #59190 - greg-kargin:master, r=sanxiyn
...
consistent naming for Rhs type parameter in libcore/ops
Rename RHS type parameter occurrences RHS->Rhs to make it consistent throughout files and follow naming conventions.
2019-03-22 19:31:21 +01:00
Felix S. Klock II
d5a61c0be2
Expand impl FromIterator for Result doc to include examples of Err and early termination.
2019-03-22 12:44:08 +01:00
Felix S. Klock II
48af7189c2
Expand impl FromIterator for Option doc to include example of early termination.
2019-03-22 12:44:08 +01:00
Christian
70ce4b168d
Wrapped a line such that it does not exceed 100 characters.
2019-03-21 19:36:51 +01:00
Christian
d7fcd219c5
Changed inline code by using a single quote.
2019-03-21 18:49:12 +01:00
Christian
a66fca459a
Added back a reference to "the book"
2019-03-21 18:42:15 +01:00
Christian
d657d18083
Fixed indentation of list items.
2019-03-21 15:26:07 +01:00
Christian
49a9b349ac
Reformatted the text such that the line length does not exceed 100.
2019-03-21 15:06:16 +01:00
gnzlbg
830c98d7fa
Fix undefined behavior in hint::spin_loop for x86 targets without SSE2
...
The pause instruction requires SSE2 but was being unconditionally used
on targets without it, resulting in undefined behavior.
This PR fixes that by only using the pause intrinsic if SSE2 is available.
It also removes the inline assembly which was not required since these
instructions are available in core::arch, and extends support of
the spin_loop hint to arm targets with the v6 feature which also
support the yield instruction.
Closes #59237 .
2019-03-21 14:23:29 +01:00
Christian
71bdeb022a
Initial version of the documentation change of std::convert.
2019-03-20 23:15:41 +01:00
Mazdak Farrokhzad
a3581aca02
Rollup merge of #59280 - joshlf:sandbox/joshlf/stabilize-refcell-map-split, r=cramertj,Centril
...
Stabilize refcell_map_split feature
Closes #51476 .
2019-03-19 15:17:00 +01:00
Mazdak Farrokhzad
1ec1c5da36
Rollup merge of #59275 - regexident:docs-self, r=joshtriplett
...
Replaced self-reflective explicit types with clearer `Self` or `Self::…` in stdlib docs
Many docs examples use explicit types instead of the semantically more clear `Self`/`Self::…` aliases.
By using the latter it's clear that the value's type depends on either `Self`, or an associated type of `Self`, instead of some constant type. It's also more consistent (and I'd argue correct), as the current docs aren't really consistent in this, as can be seen from the diff.
This is a best effort PR, as I was basically going through the docs manually, looking for offending examples. I'm sure I missed a few. Gotta start somewhere.
2019-03-19 15:16:59 +01:00
Mazdak Farrokhzad
61ff887919
Rollup merge of #58939 - taeguk:fix-doc-about-pin, r=rkruppe
...
Fix a tiny error in documentation of std::pin.
`new_unmoved` must be `mut` for passing to `std::mem::swap`.
2019-03-19 15:16:53 +01:00
Mazdak Farrokhzad
fff8586193
Rollup merge of #58778 - xfix:exact_size_case_mapping_iter, r=SimonSapin
...
Implement ExactSizeIterator for ToLowercase and ToUppercase
2019-03-19 15:16:49 +01:00
Simon Sapin
7fad370fe9
ASCII uppercase: add "subtract multiplied bool" benchmark
2019-03-19 13:41:59 +01:00
Konrad Borowski
8f261a6abe
Update since annotation for ExactSizeIterator for ToUppercase/Lowercase
...
This functionality was added in 1.35.0, not 1.34.0.
2019-03-19 08:50:02 +01:00
Simon Sapin
c1ec29ace0
ASCII uppercase: add "subtract shifted bool" benchmark
2019-03-19 08:32:15 +01:00
Simon Sapin
0ad91f73d9
Simplify u8::to_ascii_{upp,low}ercase while keeping it fast
2019-03-19 00:50:26 +01:00
Simon Sapin
4a3241a815
Benchmark more possibles impls of [u8]::make_ascii_uppercase
2019-03-19 00:49:06 +01:00
Simon Sapin
b4faa9b456
Remove ASCII_CHARACTER_CLASS table, use match with range patterns instead.
2019-03-18 23:57:09 +01:00
Simon Sapin
6d3840b23a
Add benchmarks for u8::is_ascii*
2019-03-18 23:56:50 +01:00
Simon Sapin
525a043c6b
Rename src/libcore/benches/ascii_case.rs to ascii.rs
2019-03-18 23:32:36 +01:00
Joshua Liebow-Feeser
de4be2cd85
Stabilize refcell_map_split feature
...
- Closes #51476
2019-03-18 15:06:34 -07:00
Simon Sapin
e3fb6f89fe
Tidy
2019-03-18 21:28:33 +01:00
Simon Sapin
fbe34cc521
Add benchmark for not-quite-correct “fake SIMD” make_ascii_uppercase
2019-03-18 20:40:32 +01:00
Simon Sapin
ce933f77c8
Make u8::to_ascii_lowercase and to_ascii_uppercase branchless
2019-03-18 20:16:37 +01:00
Simon Sapin
8740d5d171
Add benchmarks for [u8]::make_ascii_uppercase
2019-03-18 20:08:32 +01:00
Aleksey Kladov
9d408d972f
Add todo!() macro
...
The use-case of `todo!()` macro is to be a much easier to type
alternative to `unimplemented!()` macro.
2019-03-18 19:27:31 +03:00
Vincent Esche
698bbe5253
Replaced self-reflective explicit types with clearer Self or Self::… in stdlib docs
2019-03-18 13:57:51 +01:00
kennytm
7c009a4df7
Rollup merge of #59231 - matklad:copied, r=Centril
...
Stabilize Option::copied
closes https://github.com/rust-lang/rust/issues/57126
2019-03-16 22:42:00 +08:00
kennytm
7f81a299bc
Rollup merge of #59221 - czipperz:as_ref_documentation, r=Centril
...
Option and Result: Add references to documentation of as_ref and as_mut
This makes the documentation more consistent with that of `Pin::as_ref` which converts "from `&Pin<Pointer<T>>` to `Pin<&t>`".
This generally makes it clearer that the reference is going inside the option.
2019-03-16 22:41:05 +08:00