diff --git a/test/test_list.c b/test/test_list.c new file mode 100644 index 0000000..bbf6b4a --- /dev/null +++ b/test/test_list.c @@ -0,0 +1,208 @@ +#include +#include +#include + +#include +#include +#include +#include + +#define NELEMS 100 + +int main (int argc, char **argv) { + uint8_t verbose = argc > 1; + int i, k, n, ret; + + psycParseListState listState; + psycList list_text, list_bin; + psycString elems_text[NELEMS], elems_bin[NELEMS], elem; + char buf_text[NELEMS * 200], buf_bin[NELEMS * 200], *elems[NELEMS], **elems2 = NULL; + + struct timeval start, end; + + for (i=0; i 0); + } + gettimeofday(&end, NULL); + //printf("%ld ms\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec) / 1000); + printf("%ld us\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); +#endif + +#if 1 + printf("parsing binary list to elems[]\n"); + gettimeofday(&start, NULL); + for (n = 0; n < NELEMS; n++) { + psyc_parse_list_state_init(&listState); + psyc_parse_list_buffer_set(&listState, buf_bin, list_bin.length); + i = 0; + do { + ret = psyc_parse_list(&listState, &elem); + switch (ret) { + case PSYC_PARSE_LIST_END: + ret = 0; + case PSYC_PARSE_LIST_ELEM: + //if (verbose) printf("|%.*s\n", (int)elem.length, elem.ptr); + if (verbose) printf("|%d: %.*s... (%ld)\n", i, 10, elem.ptr, elem.length); + elems[i] = malloc(elem.length); + memcpy(elems[i++], elem.ptr, elem.length); + break; + default: + printf("# Error while parsing list: %i\n", ret); + ret = -1; + } + } while (ret > 0); + } + gettimeofday(&end, NULL); + //printf("%ld ms\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); + printf("%ld us\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); +#endif + +#if 1 + printf("parsing binary list to elems2[] with realloc\n"); + gettimeofday(&start, NULL); + for (n = 0; n < NELEMS; n++) { + psyc_parse_list_state_init(&listState); + psyc_parse_list_buffer_set(&listState, buf_bin, list_bin.length); + i = 0; + do { + ret = psyc_parse_list(&listState, &elem); + switch (ret) { + case PSYC_PARSE_LIST_END: + ret = 0; + case PSYC_PARSE_LIST_ELEM: + if (elems2) + elems2 = realloc(elems2, (i+1) * sizeof(char*)); + else + elems2 = malloc((i+1) * sizeof(char*)); + + elems2[i] = malloc(elem.length); + memcpy(elems2[i++], elem.ptr, elem.length); + break; + default: + printf("# Error while parsing list: %i\n", ret); + ret = -1; + } + } while (ret > 0); + } + gettimeofday(&end, NULL); + //printf("%ld ms\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); + printf("%ld us\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); +#endif + +#if 1 + printf("parsing binary list to elems2[] with malloc\n"); + gettimeofday(&start, NULL); + for (n = 0; n < NELEMS; n++) { + psyc_parse_list_state_init(&listState); + psyc_parse_list_buffer_set(&listState, buf_bin, list_bin.length); + i = 0; + do { + ret = psyc_parse_list(&listState, &elem); + switch (ret) { + case PSYC_PARSE_LIST_END: + ret = 0; + case PSYC_PARSE_LIST_ELEM: + /* + if (elems2) + elems2 = realloc(elems2, (i+1) * sizeof(char*)); + else + elems2 = malloc((i+1) * sizeof(char*)); + */ + elems2 = malloc(sizeof(char*)); + elems2[i] = malloc(elem.length); + memcpy(elems2[i], elem.ptr, elem.length); + break; + default: + printf("# Error while parsing list: %i\n", ret); + ret = -1; + } + } while (ret > 0); + } + gettimeofday(&end, NULL); + //printf("%ld ms\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); + printf("%ld us\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); +#endif + +#if 1 + printf("parsing binary list to elems2[] with double-parsing\n"); + gettimeofday(&start, NULL); + for (n = 0; n < NELEMS; n++) { + psyc_parse_list_state_init(&listState); + psyc_parse_list_buffer_set(&listState, buf_bin, list_bin.length); + i = 0; + k = 0; + + do { + ret = psyc_parse_list(&listState, &elem); + switch (ret) { + case PSYC_PARSE_LIST_END: + ret = 0; + case PSYC_PARSE_LIST_ELEM: + k++; + break; + default: + printf("# Error while parsing list: %i\n", ret); + ret = -1; + } + } while (ret > 0); + + elems2 = malloc(k * sizeof(char*)); + psyc_parse_list_buffer_set(&listState, buf_bin, list_bin.length); + + do { + ret = psyc_parse_list(&listState, &elem); + switch (ret) { + case PSYC_PARSE_LIST_END: + ret = 0; + case PSYC_PARSE_LIST_ELEM: + elems2[i] = malloc(elem.length); + memcpy(elems2[i++], elem.ptr, elem.length); + break; + default: + printf("# Error while parsing list: %i\n", ret); + ret = -1; + } + } while (ret > 0); + } + gettimeofday(&end, NULL); + //printf("%ld ms\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); + printf("%ld us\n", (end.tv_sec * 1000000 + end.tv_usec - start.tv_sec * 1000000 - start.tv_usec)); +#endif + + return 0; +}