about summary refs log tree commit diff
diff options
context:
space:
mode:
authorzhangyunhao <zhangyunhao116@gmail.com>2023-02-22 16:02:35 +0000
committerzhangyunhao <zhangyunhao116@gmail.com>2023-02-22 16:02:35 +0000
commite107ca0f0b6dff35efdefc2c6bdaec75b13c1109 (patch)
tree61ea9e03b4dbd4a9336a6a14f5e497796c88cb62
parent3b4d6e080404560f63599deeb328dfa27fe081a6 (diff)
downloadrust-e107ca0f0b6dff35efdefc2c6bdaec75b13c1109.tar.gz
rust-e107ca0f0b6dff35efdefc2c6bdaec75b13c1109.zip
Optimize break patterns
-rw-r--r--library/core/src/slice/sort.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/library/core/src/slice/sort.rs b/library/core/src/slice/sort.rs
index 4ca4eb86bde..7b8062c431e 100644
--- a/library/core/src/slice/sort.rs
+++ b/library/core/src/slice/sort.rs
@@ -673,19 +673,23 @@ where
 fn break_patterns<T>(v: &mut [T]) {
     let len = v.len();
     if len >= 8 {
-        // Pseudorandom number generator from the "Xorshift RNGs" paper by George Marsaglia.
-        let mut random = len as u32;
-        let mut gen_u32 = || {
-            random ^= random << 13;
-            random ^= random >> 17;
-            random ^= random << 5;
-            random
-        };
+        let mut seed = len;
         let mut gen_usize = || {
+            // Pseudorandom number generator from the "Xorshift RNGs" paper by George Marsaglia.
             if usize::BITS <= 32 {
-                gen_u32() as usize
+                let mut r = seed as u32;
+                r ^= r << 13;
+                r ^= r >> 17;
+                r ^= r << 5;
+                seed = r as usize;
+                seed
             } else {
-                (((gen_u32() as u64) << 32) | (gen_u32() as u64)) as usize
+                let mut r = seed as u64;
+                r ^= r << 13;
+                r ^= r >> 7;
+                r ^= r << 17;
+                seed = r as usize;
+                seed
             }
         };