1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-26 02:30:35 +02:00

sort: avoid pthread calls with --parallel=1

Before this change there were the following unneeded pthread calls:

  $ seq 1e6 | ltrace -c -e 'pthread*' sort --parallel=1 | wc -l
  % time     seconds  usecs/call     calls      function
  ------ ----------- ----------- --------- --------------------
   39.13    0.031757          67       468 pthread_mutex_lock
   37.96    0.030811          65       468 pthread_mutex_unlock
   13.17    0.010691          65       162 pthread_cond_signal
    2.15    0.001747          64        27 pthread_mutex_destroy
    2.00    0.001620          60        27 pthread_mutex_init
    0.70    0.000565          62         9 pthread_cond_destroy
    0.64    0.000518          57         9 pthread_cond_init
  ------ ----------- ----------- --------- --------------------
  100.00    0.081159                  1170 total

* src/sort.c (sort): Avoid merge tree overhead when single threaded.
This commit is contained in:
Pádraig Brady
2025-11-10 23:17:24 +00:00
parent 6f265b515e
commit e8dcdb9932
+18 -8
View File
@@ -4189,16 +4189,26 @@ sort (char *const *files, size_t nfiles, char const *output_file,
}
if (1 < buf.nlines)
{
struct merge_node_queue queue;
queue_init (&queue, nthreads);
struct merge_node *merge_tree =
merge_tree_init (nthreads, buf.nlines, line);
if (nthreads > 1)
{
struct merge_node_queue queue;
queue_init (&queue, nthreads);
struct merge_node *merge_tree =
merge_tree_init (nthreads, buf.nlines, line);
sortlines (line, nthreads, buf.nlines, merge_tree + 1,
&queue, tfp, temp_output);
sortlines (line, nthreads, buf.nlines, merge_tree + 1,
&queue, tfp, temp_output);
merge_tree_destroy (nthreads, merge_tree);
queue_destroy (&queue);
merge_tree_destroy (nthreads, merge_tree);
queue_destroy (&queue);
}
else
{
sequential_sort (line, buf.nlines,
line - buf.nlines, false);
for (size_t i = 0; i < buf.nlines; i++)
write_unique (line - i - 1, tfp, temp_output);
}
}
else
write_unique (line - 1, tfp, temp_output);