:: commit 7cc6af346c8a30ea7f30a621190e371410123cae

Kamila Szewczyk <kspalaiologos@gmail.com> — 2022-05-01 18:31

parents: e25ea9abf6

change default unit to mibs and reduce the amount of allocations

diff --git a/Makefile b/Makefile
index dee5601..a0d20f3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 
 CC=clang
-CFLAGS=-O3 -march=native -mtune=native -flto -g3
+CFLAGS=-O3 -march=native -mtune=native -flto
 
 .PHONY: all clean
 
diff --git a/cm.h b/cm.h
index bbb12c1..7f4d68a 100644
--- a/cm.h
+++ b/cm.h
@@ -70,8 +70,7 @@ static void init(state *s) {
 #define update0(p, x) ((p) - ((p) >> x))
 #define update1(p, x) ((p) + (((p) ^ 65535) >> x))
 
-static state *begin() {
-    state *s = malloc(sizeof(state));
+static void begin(state * s) {
     s->c1 = s->c2 = 0;
     s->run = 0;
     s->low = 0;
@@ -83,7 +82,6 @@ static state *begin() {
     for (int i = 0; i < 2; i++)
         for (int j = 0; j < 256; j++)
             for (int k = 0; k < 17; k++) s->C2[i][j][k] = (k << 12) - (k == 16);
-    return s;
 }
 
 static void encode_bit(state *s, uint8_t c) {
diff --git a/main.c b/main.c
index 8dbdaf1..2094049 100644
--- a/main.c
+++ b/main.c
@@ -15,7 +15,7 @@
 int main(int argc, char *argv[]) {
     int mode = 0;  // -1: encode, 0: unspecified, 1: encode
     char *input = NULL, *output = NULL;  // input and output file names
-    uint32_t block_size = 400 * 1024; // the block size
+    uint32_t block_size = 8 * 1024 * 1024; // the block size
 
     for (int i = 1; i < argc; i++) {
         if (argv[i][0] == '-') {
@@ -24,7 +24,7 @@ int main(int argc, char *argv[]) {
             } else if (argv[i][1] == 'd') {
                 mode = -1;
             } else if (argv[i][1] == 'b') {
-                block_size = 1024 * atoi(argv[i + 1]);
+                block_size = 1024 * 1024 * atoi(argv[i + 1]);
                 i++;
             }
         } else {
@@ -76,6 +76,8 @@ int main(int argc, char *argv[]) {
         int32_t *sais_array = malloc(block_size * sizeof(int32_t) + 16);
         int32_t bytes_read;
 
+        state s;
+
         write(output_des, "BZ3v1", 5);
         write(output_des, &block_size, sizeof(uint32_t));
 
@@ -88,13 +90,12 @@ int main(int argc, char *argv[]) {
             mtf_encode(&mtf_state, output, buffer, new_size);
             int32_t new_size2 = mrlec(buffer, new_size, output);
 
-            state *s = begin();
-            s->out_queue = buffer;
-            s->output_ptr = 0;
-            for (int32_t i = 0; i < new_size2; i++) encode_bit(s, output[i]);
-            flush(s);
-            int32_t new_size3 = s->output_ptr;
-            free(s);
+            begin(&s);
+            s.out_queue = buffer;
+            s.output_ptr = 0;
+            for (int32_t i = 0; i < new_size2; i++) encode_bit(&s, output[i]);
+            flush(&s);
+            int32_t new_size3 = s.output_ptr;
 
             write(output_des, &crc32, sizeof(uint32_t));
             write(output_des, &bytes_read, sizeof(int32_t));
@@ -121,6 +122,8 @@ int main(int argc, char *argv[]) {
         uint8_t *output = malloc(block_size + block_size / 2);
         int32_t *sais_array = malloc(block_size * sizeof(int32_t) + 16);
 
+        state s;
+
         while (1) {
             #define safe_read(fd, buf, size) \
                 if (read(fd, buf, size) != size) break;
@@ -136,13 +139,12 @@ int main(int argc, char *argv[]) {
             safe_read(input_des, &new_size3, sizeof(int32_t));
             safe_read(input_des, buffer, new_size3);
 
-            state *s = begin();
-            s->in_queue = buffer;
-            s->input_ptr = 0;
-            s->input_max = new_size3;
-            init(s);
-            for (int32_t i = 0; i < new_size2; i++) output[i] = decode_bit(s);
-            free(s);
+            begin(&s);
+            s.in_queue = buffer;
+            s.input_ptr = 0;
+            s.input_max = new_size3;
+            init(&s);
+            for (int32_t i = 0; i < new_size2; i++) output[i] = decode_bit(&s);
             mrled(output, buffer, new_size);
             mtf_decode(&mtf_state, buffer, output, new_size);
             libsais_unbwt(output, buffer, sais_array, new_size, NULL,
@@ -154,5 +156,9 @@ int main(int argc, char *argv[]) {
             }
             write(output_des, output, bytes_read);
         }
+
+        free(buffer);
+        free(output);
+        free(sais_array);
     }
 }
tab: 248 wrap: offon