altos/lisp: Optimize chunk searching in collect
[fw/altos] / src / test / ao_lisp_test.c
index 6973910016ec0fc7072f65c54d7a0edcec739696..68e3a2027d6f3ee1a51250d588b31b70c3fdaea4 100644 (file)
 static FILE *ao_lisp_file;
 static int newline = 1;
 
+static char save_file[] = "lisp.image";
+
+int
+ao_lisp_os_save(void)
+{
+       FILE    *save = fopen(save_file, "w");
+
+       if (!save) {
+               perror(save_file);
+               return 0;
+       }
+       fwrite(ao_lisp_pool, 1, AO_LISP_POOL_TOTAL, save);
+       fclose(save);
+       return 1;
+}
+
+int
+ao_lisp_os_restore_save(struct ao_lisp_os_save *save, int offset)
+{
+       FILE    *restore = fopen(save_file, "r");
+       size_t  ret;
+
+       if (!restore) {
+               perror(save_file);
+               return 0;
+       }
+       fseek(restore, offset, SEEK_SET);
+       ret = fread(save, sizeof (struct ao_lisp_os_save), 1, restore);
+       fclose(restore);
+       if (ret != 1)
+               return 0;
+       return 1;
+}
+
+int
+ao_lisp_os_restore(void)
+{
+       FILE    *restore = fopen(save_file, "r");
+       size_t  ret;
+
+       if (!restore) {
+               perror(save_file);
+               return 0;
+       }
+       ret = fread(ao_lisp_pool, 1, AO_LISP_POOL_TOTAL, restore);
+       fclose(restore);
+       if (ret != AO_LISP_POOL_TOTAL)
+               return 0;
+       return 1;
+}
+
 int
 ao_lisp_getc(void)
 {
@@ -50,4 +101,34 @@ main (int argc, char **argv)
                ao_lisp_file = NULL;
        }
        ao_lisp_read_eval_print();
+
+       printf ("collects: full: %d incremental %d\n",
+               ao_lisp_collects[AO_LISP_COLLECT_FULL],
+               ao_lisp_collects[AO_LISP_COLLECT_INCREMENTAL]);
+
+       printf ("freed: full %d incremental %d\n",
+               ao_lisp_freed[AO_LISP_COLLECT_FULL],
+               ao_lisp_freed[AO_LISP_COLLECT_INCREMENTAL]);
+
+       printf("loops: full %d incremental %d\n",
+               ao_lisp_loops[AO_LISP_COLLECT_FULL],
+               ao_lisp_loops[AO_LISP_COLLECT_INCREMENTAL]);
+
+       printf("loops per collect: full %f incremental %f\n",
+              (double) ao_lisp_loops[AO_LISP_COLLECT_FULL] /
+              (double) ao_lisp_collects[AO_LISP_COLLECT_FULL],
+              (double) ao_lisp_loops[AO_LISP_COLLECT_INCREMENTAL] /
+              (double) ao_lisp_collects[AO_LISP_COLLECT_INCREMENTAL]);
+
+       printf("freed per collect: full %f incremental %f\n",
+              (double) ao_lisp_freed[AO_LISP_COLLECT_FULL] /
+              (double) ao_lisp_collects[AO_LISP_COLLECT_FULL],
+              (double) ao_lisp_freed[AO_LISP_COLLECT_INCREMENTAL] /
+              (double) ao_lisp_collects[AO_LISP_COLLECT_INCREMENTAL]);
+
+       printf("freed per loop: full %f incremental %f\n",
+              (double) ao_lisp_freed[AO_LISP_COLLECT_FULL] /
+              (double) ao_lisp_loops[AO_LISP_COLLECT_FULL],
+              (double) ao_lisp_freed[AO_LISP_COLLECT_INCREMENTAL] /
+              (double) ao_lisp_loops[AO_LISP_COLLECT_INCREMENTAL]);
 }