mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-08-01 13:37:48 +00:00
sort: use unstable sort when possible (#2076)
* sort: use unstable sort when possible This results in a very minor performance (speed) improvement. It does however result in a memory usage reduction, because unstable sort does not allocate auxiliary memory. There's also an improvement in overall CPU usage. * add benchmarking instructions * add user time * fix typo
This commit is contained in:
parent
045eb0088a
commit
519b9d34a6
2 changed files with 46 additions and 1 deletions
|
@ -90,3 +90,44 @@ duplicate the string you passed to hyperfine but remove the `target/release/core
|
||||||
Example: `hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt"` becomes
|
Example: `hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt"` becomes
|
||||||
`hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt" "sort shuffled_numbers_si.txt -h -o output.txt"`
|
`hyperfine "target/release/coreutils sort shuffled_numbers_si.txt -h -o output.txt" "sort shuffled_numbers_si.txt -h -o output.txt"`
|
||||||
(This assumes GNU sort is installed as `sort`)
|
(This assumes GNU sort is installed as `sort`)
|
||||||
|
|
||||||
|
## Memory and CPU usage
|
||||||
|
|
||||||
|
The above benchmarks use hyperfine to measure the speed of sorting. There are however other useful metrics to determine overall
|
||||||
|
resource usage. One way to measure them is the `time` command. This is not to be confused with the `time` that is built in to the bash shell.
|
||||||
|
You may have to install `time` first, then you have to run it with `/bin/time -v` to give it precedence over the built in `time`.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Example output</summary>
|
||||||
|
|
||||||
|
Command being timed: "target/release/coreutils sort shuffled_numbers.txt"
|
||||||
|
User time (seconds): 0.10
|
||||||
|
System time (seconds): 0.00
|
||||||
|
Percent of CPU this job got: 365%
|
||||||
|
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.02
|
||||||
|
Average shared text size (kbytes): 0
|
||||||
|
Average unshared data size (kbytes): 0
|
||||||
|
Average stack size (kbytes): 0
|
||||||
|
Average total size (kbytes): 0
|
||||||
|
Maximum resident set size (kbytes): 25360
|
||||||
|
Average resident set size (kbytes): 0
|
||||||
|
Major (requiring I/O) page faults: 0
|
||||||
|
Minor (reclaiming a frame) page faults: 5802
|
||||||
|
Voluntary context switches: 462
|
||||||
|
Involuntary context switches: 73
|
||||||
|
Swaps: 0
|
||||||
|
File system inputs: 1184
|
||||||
|
File system outputs: 0
|
||||||
|
Socket messages sent: 0
|
||||||
|
Socket messages received: 0
|
||||||
|
Signals delivered: 0
|
||||||
|
Page size (bytes): 4096
|
||||||
|
Exit status: 0
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
Useful metrics to look at could be:
|
||||||
|
|
||||||
|
- User time
|
||||||
|
- Percent of CPU this job got
|
||||||
|
- Maximum resident set size
|
||||||
|
|
|
@ -985,7 +985,11 @@ fn exec_check_file(unwrapped_lines: &[Line], settings: &GlobalSettings) -> i32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn sort_by(lines: &mut Vec<Line>, settings: &GlobalSettings) {
|
fn sort_by(lines: &mut Vec<Line>, settings: &GlobalSettings) {
|
||||||
lines.par_sort_by(|a, b| compare_by(a, b, &settings))
|
if settings.stable || settings.unique {
|
||||||
|
lines.par_sort_by(|a, b| compare_by(a, b, &settings))
|
||||||
|
} else {
|
||||||
|
lines.par_sort_unstable_by(|a, b| compare_by(a, b, &settings))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compare_by(a: &Line, b: &Line, global_settings: &GlobalSettings) -> Ordering {
|
fn compare_by(a: &Line, b: &Line, global_settings: &GlobalSettings) -> Ordering {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue