Unified · Split
| @@ -134,16 +134,14 @@ pub fn optimize_chunk_size_and_thread_limit( · 133 unmodified lines | |||
| 134 | let desired_chunks_per_thread_at_least = 2; | 134 | let desired_chunks_per_thread_at_least = 2; |
| 135 | let (chunk_size, thread_limit) = num_chunks | 135 | let (chunk_size, thread_limit) = num_chunks |
| 136 | .map(|num_chunks| { | 136 | .map(|num_chunks| { |
| 137 | let thread_limit = if num_chunks <= available_threads * desired_chunks_per_thread_at_least { | 137 | let items = num_chunks * desired_chunk_size; |
| 138 | let chunk_size = (items / (available_threads * desired_chunks_per_thread_at_least)).max(1); | ||
| 139 | let num_chunks = items / chunk_size; | ||
| 140 | let thread_limit = if num_chunks <= available_threads { | ||
| 138 | (num_chunks / desired_chunks_per_thread_at_least).max(1) | 141 | (num_chunks / desired_chunks_per_thread_at_least).max(1) |
| 139 | } else { | 142 | } else { |
| 140 | available_threads | 143 | available_threads |
| 141 | }; | 144 | }; |
| 142 | let chunk_size = if num_chunks / thread_limit > desired_chunks_per_thread_at_least { | ||
| 143 | (desired_chunk_size * (num_chunks / thread_limit / desired_chunks_per_thread_at_least)).max(1) | ||
| 144 | } else { | ||
| 145 | desired_chunk_size | ||
| 146 | }; | ||
| 147 | (chunk_size, thread_limit) | 145 | (chunk_size, thread_limit) |
| 148 | }) | 146 | }) |
| 149 | .unwrap_or((desired_chunk_size, available_threads)); | 147 | .unwrap_or((desired_chunk_size, available_threads)); |
| @@ -38,7 +38,7 @@ mod optimize_chunk_size_and_thread_limit { · 37 unmodified lines | |||
| 38 | fn chunk_size_too_big() { | 38 | fn chunk_size_too_big() { |
| 39 | assert_eq!( | 39 | assert_eq!( |
| 40 | optimize_chunk_size_and_thread_limit(50, Some(2), None, Some(10)), | 40 | optimize_chunk_size_and_thread_limit(50, Some(2), None, Some(10)), |
| 41 | (2, Some(10)) | 41 | (5, Some(10)) |
| 42 | ); | 42 | ); |
| 43 | } | 43 | } |
| 44 | } | 44 | } |