Using a bubble sort is slow, switch to an insertion sort.

bubble sort:     real    3m45.168s

insertion sort:  real    0m3.164s

Signed-off-by: Don Slutz <[email protected]>
---
I do have a big (32G sized file, that gzipped is 357M).
let me know if you want it.
It is the same as the xen rename of dom0

 makedumpfile.c | 56 +++++++++++++++++++++++++-------------------------------
 1 file changed, 25 insertions(+), 31 deletions(-)

diff --git a/makedumpfile.c b/makedumpfile.c
index f6834b9..c76e22c 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -56,8 +56,10 @@ store_flat_data_array(char *file, struct flat_data **fda)
 {
        int                     result = FALSE, fd;
        int64_t                 offset_fdh;
+       int64_t                 offset_report = 0;
        unsigned long long      num_allocated = 0;
        unsigned long long      num_stored    = 0;
+       unsigned long long      sort_idx;
        unsigned long long      size_allocated;
        struct flat_data        *ptr = NULL, *cur, *new;
        struct makedumpfile_data_header fdh;
@@ -100,11 +102,34 @@ store_flat_data_array(char *file, struct flat_data **fda)
                        break;
                }
                cur = ptr + num_stored;
+               sort_idx = num_stored;
+               while (sort_idx) {
+                       new = ptr + --sort_idx;
+                       if (new->off_rearranged >= fdh.offset) {
+                               cur->off_flattened = new->off_flattened;
+                               cur->off_rearranged = new->off_rearranged;
+                               cur->buf_size = new->buf_size;
+                               cur = new;
+                       } else {
+                               if (CRASHDEBUG(1) && sort_idx + 1 != 
num_stored) {
+                                       fprintf(fp,
+                                               "makedumpfile: Moved from %lld 
to %lld\n",
+                                               num_stored, sort_idx + 1);
+                               }
+                               break;
+                       }
+               }
                cur->off_flattened  = offset_fdh + sizeof(fdh);
                cur->off_rearranged = fdh.offset;
                cur->buf_size       = fdh.buf_size;
                num_stored++;
 
+               if (CRASHDEBUG(1) && (fdh.offset >> 30) > (offset_report >> 
30)) {
+                       fprintf(fp, "makedumpfile: At %lld GiB\n",
+                             fdh.offset >> 30);
+                       offset_report = fdh.offset;
+               }
+
                /* seek for next makedumpfile_data_header. */
                if (lseek(fd, fdh.buf_size, SEEK_CUR) < 0) {
                        error(INFO, "%s: seek error (flat format)\n", file);
@@ -121,35 +146,6 @@ store_flat_data_array(char *file, struct flat_data **fda)
        return num_stored;
 }
 
-static void
-sort_flat_data_array(struct flat_data **fda, unsigned long long num_fda)
-{
-       unsigned long long      i, j;
-       struct flat_data        tmp, *cur_i, *cur_j;
-
-       for (i = 0; i < num_fda - 1; i++) {
-               for (j = i + 1; j < num_fda; j++) {
-                       cur_i = *fda + i;
-                       cur_j = *fda + j;
-
-                       if (cur_i->off_rearranged < cur_j->off_rearranged)
-                               continue;
-
-                       tmp.off_flattened  = cur_i->off_flattened;
-                       tmp.off_rearranged = cur_i->off_rearranged;
-                       tmp.buf_size       = cur_i->buf_size;
-
-                       cur_i->off_flattened  = cur_j->off_flattened;
-                       cur_i->off_rearranged = cur_j->off_rearranged;
-                       cur_i->buf_size       = cur_j->buf_size;
-
-                       cur_j->off_flattened  = tmp.off_flattened;
-                       cur_j->off_rearranged = tmp.off_rearranged;
-                       cur_j->buf_size       = tmp.buf_size;
-               }
-       }
-}
-
 static int
 read_all_makedumpfile_data_header(char *file)
 {
@@ -161,8 +157,6 @@ read_all_makedumpfile_data_header(char *file)
        if (retval < 0)
                return FALSE;
 
-       sort_flat_data_array(&fda, num);
-
        afd.num_array = num;
        afd.array     = fda;
 
-- 
1.8.4

--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility

Reply via email to