45149 Commits

Author SHA1 Message Date
Ulrik Sverdrup
2b82c072c7 StrSearcher: Improve inner loop in TwoWaySearcher::next, next_back
The innermost loop of TwoWaySearcher checks the boundary of the haystack
vs position + needle.len(), and it checks the last byte of the needle
against the byteset.

If these two steps are combined by using the indexing of the last
needle byte's position as bounds check, the algorithm improves its
throughput. We improve the innermost loop by reducing the number of
instructions used, and elminating the panic case for the checked
indexing that was previously used.

Selected benchmarks from the external/workspace testsuite. Benchmarks
improve across the board.

```
before:

test bb_in_aa::twoway_find                  ... bench:       4,229 ns/iter (+/- 1,305) = 23646 MB/s
test bb_in_aa::twoway_rfind                 ... bench:       3,873 ns/iter (+/- 101) = 25819 MB/s
test short_1let_long::twoway_find           ... bench:       7,075 ns/iter (+/- 29) = 360 MB/s
test short_1let_long::twoway_rfind          ... bench:       6,640 ns/iter (+/- 79) = 384 MB/s
test short_2let_long::twoway_find           ... bench:       3,823 ns/iter (+/- 16) = 667 MB/s
test short_2let_long::twoway_rfind          ... bench:       3,774 ns/iter (+/- 44) = 675 MB/s
test short_3let_long::twoway_find           ... bench:       3,582 ns/iter (+/- 47) = 712 MB/s
test short_3let_long::twoway_rfind          ... bench:       3,616 ns/iter (+/- 34) = 705 MB/s

with this commit:

test bb_in_aa::twoway_find                  ... bench:       2,952 ns/iter (+/- 20) = 33875 MB/s
test bb_in_aa::twoway_rfind                 ... bench:       2,939 ns/iter (+/- 99) = 34025 MB/s
test short_1let_long::twoway_find           ... bench:       4,593 ns/iter (+/- 4) = 555 MB/s
test short_1let_long::twoway_rfind          ... bench:       4,592 ns/iter (+/- 76) = 555 MB/s
test short_2let_long::twoway_find           ... bench:       2,804 ns/iter (+/- 3) = 909 MB/s
test short_2let_long::twoway_rfind          ... bench:       2,807 ns/iter (+/- 40) = 908 MB/s
test short_3let_long::twoway_find           ... bench:       3,105 ns/iter (+/- 120) = 821 MB/s
test short_3let_long::twoway_rfind          ... bench:       3,019 ns/iter (+/- 50) = 844 MB/s
```

- `bb_in_aa`: fast skip due to byteset filter loop improves.
- 1/2/3let: Searches for 1, 2, or 3 ascii bytes improves.
2015-08-07 13:41:17 +02:00
Ulrik Sverdrup
7ebae85bb8 StrSearcher: Implement the full two way algorithm in reverse for rfind
Fix quadratic behavior in StrSearcher in reverse search with periodic
needles.

This commit adds the missing pieces for the "short period" case in
reverse search. The short case will show up when the needle is literally
periodic, for example "abababab".

Two way uses a "critical factorization" of the needle: x = u v.

Searching matches v first, if mismatch at character k, skip k forward.
Matching u, if mismatch, skip period(x) forward.

To avoid O(mn) behavior after mismatch in u, memorize the already
matched prefix.

The short period case requires that |u| < period(x).

For the reverse search we need to compute a different critical
factorization x = u' v' where |v'| < period(x), because we are searching
for the reversed needle. A short v' also benefits the algorithm in
general.

The reverse critical factorization is computed quickly by using the same
maximal suffix algorithm, but terminating as soon as we have a location
with local period equal to period(x).

This adds extra fields crit_pos_back and memory_back for the reverse
case. The new overhead for TwoWaySearcher::new is low, and additionally
I think the "short period" case is uncommon in many applications of
string search.

The maximal_suffix methods were updated in documentation and the
algorithms updated to not use !0 and wrapping add, variable left is now
1 larger, offset 1 smaller.

Use periodicity when computing byteset: in the periodic case, just
iterate over one period instead of the whole needle.

Example before (rfind) after (twoway_rfind) benchmark shows the removal
of quadratic behavior.

needle: "ab" * 100, haystack: ("bb" + "ab" * 100) * 100

```
test periodic::rfind           ... bench:   1,926,595 ns/iter (+/- 11,390) = 10 MB/s
test periodic::twoway_rfind    ... bench:      51,740 ns/iter (+/- 66) = 386 MB/s
```
2015-08-02 20:09:35 +02:00
Ulrik Sverdrup
c5a1d8c3db StrSearcher: Add tests for rfind(&str)
Add tests for .rfind(&str), using the reverse searcher case for
substring search.
2015-08-02 20:08:35 +02:00
bors
832e5a02cd Auto merge of #27453 - Manishearth:rollup, r=Manishearth
- Successful merges: #26982, #27305, #27419, #27423, #27426
- Failed merges:
2015-08-01 08:36:59 +00:00
Manish Goregaokar
ead9a6dacf Rollup merge of #27426 - FuGangqiang:master, r=alexcrichton 2015-08-01 14:05:52 +05:30
Manish Goregaokar
548d552c7e Rollup merge of #27423 - oli-obk:patch-1, r=Gankro 2015-08-01 14:05:52 +05:30
Manish Goregaokar
ae9abdf705 Rollup merge of #27419 - cpjreynolds:master, r=Gankro
Corrects formatting of bullet-ed sentences and changes 'pervasive use raw pointers' to 'pervasive use of raw pointers'.
2015-08-01 14:05:52 +05:30
Manish Goregaokar
21dd5e62a2 Rollup merge of #26982 - nham:orphan-explanations, r=Gankro
part of #24407 

I'm not sure whether I should be trying to explain the general rule in the E0210 explanation or just point people to the RFC. However, if we go with the latter option I think that the RFC will need to be revised slightly, since it is not quite as gentle as I would like.

Also, the link to RFC 1023 is not the correct one (it should be https://github.com/rust-lang/rfcs/blob/master/text/1023-rebalancing-coherence.md), but the correct one is too long. I'm aware of @michaelsproul's PR https://github.com/rust-lang/rust/pull/26290 from awhile back, but it doesn't seem to be working. Has there not been a new snapshot yet?
2015-08-01 12:31:23 +05:30
bors
f50518e05a Auto merge of #27447 - eefriedman:parser-cleanup, r=alexcrichton 2015-08-01 04:49:02 +00:00
bors
6beaedaa5f Auto merge of #27441 - dhuseby:adding_freebsd32_snap, r=brson
@alexcrichton please upload the FreeBSD 32-bit snapshot file when landing this patch:
https://github.com/dhuseby/rust-manual-snapshots/raw/master/rust-stage0-2015-07-26-a5c12f4-freebsd-i386-2fee22adec101e2f952a5548fd1437ce1bd8d26f.tar.bz2
2015-08-01 03:14:38 +00:00
bors
111fa82f35 Auto merge of #27440 - dhuseby:fixing_freebsd_unused_import, r=alexcrichton
@alexcrichton fixes the build bot failures due to unused imports being treated as errors.
2015-08-01 01:25:31 +00:00
bors
8ce69e856a Auto merge of #27437 - retep998:win10-sdk, r=alexcrichton
r? @alexcrichton
2015-07-31 23:51:25 +00:00
bors
a8b7146f70 Auto merge of #27432 - sanxiyn:impl-dotdot, r=sfackler
Fix #27255.
2015-07-31 22:17:12 +00:00
bors
8c634cef95 Auto merge of #27424 - jashank:patch-1, r=alexcrichton
#27360 removed a padding field full of uint8_t's, but didn't remove
the use.  This didn't get picked up presumably because (a) bors
doesn't have any BSD builders, and/or (b) #[cfg]'d out blocks don't
get linted.

```
rustc: x86_64-unknown-freebsd/stage1/lib/rustlib/x86_64-unknown-freebsd/lib/liblibc
src/liblibc/lib.rs:1099:42: 1099:49 error: unused import, #[deny(unused_imports)] on by default
src/liblibc/lib.rs:1099                 use types::common::c99::{uint8_t, uint32_t, int32_t};
                                                                 ^~~~~~~
error: aborting due to previous error
fatal runtime error: Could not unwind stack, error = 159555904
```
2015-07-31 19:33:02 +00:00
Dave Huseby
6109d0567d adds FreeBSD i686 snapshot 2015-07-31 11:58:38 -07:00
Peter Atashian
6a8aec3561 Add Win10 SDK lib subfolder name
Signed-off-by: Peter Atashian <retep998@gmail.com>
2015-07-31 14:40:05 -04:00
bors
89bc9fa8be Auto merge of #27418 - taliesinb:tarpl-typo, r=alexcrichton
this makes the second code block consistent with the first code block -- other than being in reversed order, the first code block claims b is u16 and c is u32, whereas the second code block claims the opposite. seems to be an obvious typo.
2015-07-31 17:55:22 +00:00
Dave Huseby
ea12c02ee2 fixes unused import compile failure 2015-07-31 09:19:02 -07:00
bors
0919f4ad86 Auto merge of #27414 - Gankro:tarpl-fixes, r=alexcrichton
This is *mostly* reducing *my* use of *italics* but there's some other misc changes interspersed as I went along.

This updates the italicizing alphabetically from `a` to `ra`.

r? @steveklabnik
2015-07-31 15:28:54 +00:00
Alexis Beingessner
554efc0134 last of the emphasis cleanup 2015-07-31 07:11:35 -07:00
bors
7597262767 Auto merge of #27431 - GuillaumeGomez:patch-3, r=Manishearth 2015-07-31 12:52:41 +00:00
Seo Sanghyeon
b5139c5c58 Fix impl A .. {} 2015-07-31 21:24:55 +09:00
Guillaume Gomez
3254ae6a52 Replace "impls" by "implementations" 2015-07-31 12:55:53 +02:00
FuGangqiang
b399729298 trpl: fix link error 2015-07-31 16:25:17 +08:00
Jashank Jeremy
44e2d3b4fe Fix #27360's unused import
#27360 removed a padding field full of uint8_t's, but didn't remove
the use.  This didn't get picked up presumably because (a) bors
doesn't have any BSD builders, and/or (b) #[cfg]'d out blocks don't
get linted.

```
rustc: x86_64-unknown-freebsd/stage1/lib/rustlib/x86_64-unknown-freebsd/lib/liblibc
src/liblibc/lib.rs:1099:42: 1099:49 error: unused import, #[deny(unused_imports)] on by default
src/liblibc/lib.rs:1099                 use types::common::c99::{uint8_t, uint32_t, int32_t};
                                                                 ^~~~~~~
error: aborting due to previous error
fatal runtime error: Could not unwind stack, error = 159555904
```
2015-07-31 18:11:10 +10:00
Oliver Schneider
6a86a0c89c fix code and error to match the surronding text 2015-07-31 09:32:53 +02:00
bors
a7b8f5bc47 Auto merge of #27405 - brson:relnotes, r=alexcrichton 2015-07-31 06:09:29 +00:00
bors
8d2eb5971a Auto merge of #27382 - brson:gate-assoc-type, r=alexcrichton
There are still problems in both the design and implementation of this, so we don't want it landing in 1.2.

cc @arielb1 @nikomatsakis 

cc #27364

r? @alexcrichton
2015-07-31 04:33:34 +00:00
Eli Friedman
f9692d5d00 Remove unused code in parser. 2015-07-30 20:51:51 -07:00
Cole Reynolds
d10953e5a2 Minor grammatical changes to send-and-sync.
Corrects formatting of bullet-ed sentences and changes 'pervasive use raw pointers' to 'pervasive use of raw pointers'
2015-07-30 23:40:04 -04:00
Taliesin Beynon
b36890b069 fix switched-round 'b' and 'c' 2015-07-30 23:18:09 -04:00
bors
cb250b722e Auto merge of #27370 - alexcrichton:stabilize-easy, r=brson
The following APIs were all marked with a `#[stable]` tag:

* process::Child::id
* error::Error::is
* error::Error::downcast
* error::Error::downcast_ref
* error::Error::downcast_mut
* io::Error::get_ref
* io::Error::get_mut
* io::Error::into_inner
* hash::Hash::hash_slice
* hash::Hasher::write_{i,u}{8,16,32,64,size}
2015-07-31 02:57:34 +00:00
Alexis Beingessner
7b33a1e2de frob emphasis 2015-07-30 18:47:02 -07:00
bors
dc966ef95c Auto merge of #26897 - RalfJung:stdin-mut, r=alexcrichton
This fixes #26890.

To be honest, the local compile-test is still running. This just takes so long. But this looks trivial enough...
2015-07-31 01:21:23 +00:00
Alexis Beingessner
66ba6924cb make the intro less scary 2015-07-30 16:51:22 -07:00
bors
4dfe7a16cd Auto merge of #27410 - Gankro:meta, r=alexcrichton
Fixes #27404
2015-07-30 23:45:43 +00:00
Alexis Beingessner
b52f6187d5 fix title-casing 2015-07-30 16:39:46 -07:00
Alexis Beingessner
5b0721d0fe fix rustdoc metadata parsing 2015-07-30 15:51:50 -07:00
Brian Anderson
4aaf1beffb Fix tests 2015-07-30 15:18:34 -07:00
bors
66109d2c38 Auto merge of #27406 - alexcrichton:fix-no-run, r=Gankro
Needs the underscore for rustdoc to not actually run it.
2015-07-30 22:06:27 +00:00
Brian Anderson
4d218d924f More 1.2 relnotes 2015-07-30 14:32:08 -07:00
Alex Crichton
127e63c63b tarpl: Change norun to no_run
Needs the underscore for rustdoc to not actually run it.
2015-07-30 14:32:02 -07:00
bors
6edc994021 Auto merge of #27388 - alexcrichton:remove-curious-inner, r=brson
This isn't actually necessary any more with the advent of `$crate` and changes
in the compiler to expand macros to `::core::$foo` in the context of a
`#![no_std]` crate.

The libcore inner module was also trimmed down a bit to the bare bones.
2015-07-30 18:42:32 +00:00
bors
28869d45dd Auto merge of #27399 - Gankro:race, r=alexcrichton
r? @alexcrichton
2015-07-30 16:18:32 +00:00
Alexis Beingessner
d1cf449034 Maybe ignore the explicit examples of a race condition 2015-07-30 08:53:46 -07:00
bors
dbf3a63dd7 Auto merge of #27386 - chris-morgan:ctags-stuff-update, r=alexcrichton
As there’s no C++ runtime any more there’s really no point in having anything but Rust tags being made.

I’ve also taken the liberty of excluding the compiler parts of this in the `librust%,,` pattern substitution. Whether or not this is “correct” will depend on whether you want tags for the compiler or for general use. For myself, I want it for general use.

I’m not sure how much people use the tags files anyway. I definitely do, but with Racer existing the tags files aren’t quite so necessary.
2015-07-30 13:39:08 +00:00
bors
5fcaf95676 Auto merge of #27385 - chris-morgan:core-panic-use-$crate, r=alexcrichton
I’ve been sitting on this one for ages now. Silly me, if only I had got on and submitted it earlier it’d be into the stable release by now…
2015-07-30 12:01:41 +00:00
bors
87055a68c3 Auto merge of #27371 - Gankro:str-clone, r=alexcrichton
This is a minor [breaking-change], as it changes what
`boxed_str.to_owned()` does (previously it would deref to `&str` and
call `to_owned` on that to get a `String`). However `Box<str>` is such an
exceptionally rare type that this is not expected to be a serious
concern. Also a `Box<str>` can be freely converted to a `String` to
obtain the previous result anyway.
2015-07-30 10:25:23 +00:00
bors
f97a82fd43 Auto merge of #27392 - pnkfelix:rename-xpretty-as-unpretty, r=jroesch
Rename the unstable option `--xpretty` to `--unpretty`

(Inspired by discussion with Gankro.)

Make sure this gets a low priority if it gets r-plussed!
2015-07-30 07:31:14 +00:00
bors
db2af71d59 Auto merge of #27174 - Gankro:rc-sat, r=alexcrichton
See https://internals.rust-lang.org/t/rc-is-unsafe-mostly-on-32-bit-targets-due-to-overflow/2120 for detailed discussion of this problem.
2015-07-30 05:54:55 +00:00