File tree 2 files changed +23
-15
lines changed
2 files changed +23
-15
lines changed Original file line number Diff line number Diff line change @@ -515,19 +515,9 @@ impl<T> SliceExt for [T] {
515
515
fn copy_from_slice ( & mut self , src : & [ T ] ) where T : Copy {
516
516
assert ! ( self . len( ) == src. len( ) ,
517
517
"destination and source slices have different lengths" ) ;
518
- // First check if the amount of elements we want to copy is small:
519
- // `copy_nonoverlapping` will do a memcopy, which involves an indirect
520
- // function call when `memcpy` is in the dynamically-linked libc. For
521
- // small elements (such as a single byte or pointer), the overhead is
522
- // significant. If the element is big then the assignment is a memcopy
523
- // anyway.
524
- if self . len ( ) == 1 {
525
- self [ 0 ] = src[ 0 ] ;
526
- } else {
527
- unsafe {
528
- ptr:: copy_nonoverlapping (
529
- src. as_ptr ( ) , self . as_mut_ptr ( ) , self . len ( ) ) ;
530
- }
518
+ unsafe {
519
+ ptr:: copy_nonoverlapping (
520
+ src. as_ptr ( ) , self . as_mut_ptr ( ) , self . len ( ) ) ;
531
521
}
532
522
}
533
523
Original file line number Diff line number Diff line change @@ -157,7 +157,16 @@ impl<'a> Read for &'a [u8] {
157
157
fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
158
158
let amt = cmp:: min ( buf. len ( ) , self . len ( ) ) ;
159
159
let ( a, b) = self . split_at ( amt) ;
160
- buf[ ..amt] . copy_from_slice ( a) ;
160
+
161
+ // First check if the amount of bytes we want to read is small:
162
+ // `copy_from_slice` will generally expand to a call to `memcpy`, and
163
+ // for a single byte the overhead is significant.
164
+ if amt == 1 {
165
+ buf[ 0 ] = a[ 0 ] ;
166
+ } else {
167
+ buf[ ..amt] . copy_from_slice ( a) ;
168
+ }
169
+
161
170
* self = b;
162
171
Ok ( amt)
163
172
}
@@ -169,7 +178,16 @@ impl<'a> Read for &'a [u8] {
169
178
"failed to fill whole buffer" ) ) ;
170
179
}
171
180
let ( a, b) = self . split_at ( buf. len ( ) ) ;
172
- buf. copy_from_slice ( a) ;
181
+
182
+ // First check if the amount of bytes we want to read is small:
183
+ // `copy_from_slice` will generally expand to a call to `memcpy`, and
184
+ // for a single byte the overhead is significant.
185
+ if buf. len ( ) == 1 {
186
+ buf[ 0 ] = a[ 0 ] ;
187
+ } else {
188
+ buf. copy_from_slice ( a) ;
189
+ }
190
+
173
191
* self = b;
174
192
Ok ( ( ) )
175
193
}
You can’t perform that action at this time.
0 commit comments