From baba826d212bd44332946bb1758c63067bfb85ba Mon Sep 17 00:00:00 2001 From: Al Date: Sun, 17 Jan 2016 20:39:19 -0500 Subject: [PATCH] [io] Cutting down on system calls in trie_read --- src/trie.c | 83 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/src/trie.c b/src/trie.c index f2800485..40d8e652 100644 --- a/src/trie.c +++ b/src/trie.c @@ -987,38 +987,45 @@ trie_t *trie_read(FILE *file) { uint32_t signature; - if (!file_read_uint32(file, &signature)) + if (!file_read_uint32(file, &signature)) { goto exit_file_read; + } - if (signature != TRIE_SIGNATURE) + if (signature != TRIE_SIGNATURE) { goto exit_file_read; + } uint32_t alphabet_size; - if (!file_read_uint32(file, &alphabet_size)) + if (!file_read_uint32(file, &alphabet_size)) { goto exit_file_read; + } log_debug("alphabet_size=%d\n", alphabet_size); if (alphabet_size > NUM_CHARS) goto exit_file_read; - if (!file_read_chars(file, (char *)alphabet, alphabet_size)) + if (!file_read_chars(file, (char *)alphabet, alphabet_size)) { goto exit_file_read; + } trie_t *trie = trie_new_empty(alphabet, alphabet_size); - if (!trie) + if (!trie) { goto exit_file_read; + } uint32_t num_keys; - if (!file_read_uint32(file, &num_keys)) + if (!file_read_uint32(file, &num_keys)) { goto exit_file_read; + } trie->num_keys = num_keys; uint32_t num_nodes; - if (!file_read_uint32(file, &num_nodes)) + if (!file_read_uint32(file, &num_nodes)) { goto exit_trie_created; + } log_debug("num_nodes=%d\n", num_nodes); trie_node_array_resize(trie->nodes, num_nodes); @@ -1026,45 +1033,69 @@ trie_t *trie_read(FILE *file) { int32_t base; int32_t check; trie_node_t node; - for (i = 0; i < num_nodes; i++) { - if (!file_read_uint32(file, (uint32_t *)&base) || - !file_read_uint32(file, (uint32_t *)&check)) - goto exit_trie_created; - node.base = base; - node.check = check; - trie_node_array_push(trie->nodes, node); + unsigned char *buf; + size_t buf_size = num_nodes * sizeof(uint32_t) * 2; + buf = malloc(buf_size); + + unsigned char *buf_ptr; + + if (file_read_chars(file, (char *)buf, buf_size)) { + buf_ptr = buf; + for (i = 0; i < num_nodes; i++) { + node.base = (int32_t)file_deserialize_uint32(buf_ptr); + buf_ptr += sizeof(uint32_t); + node.check = (int32_t)file_deserialize_uint32(buf_ptr); + buf_ptr += sizeof(uint32_t); + + trie_node_array_push(trie->nodes, node); + } } + free(buf); + buf = NULL; + uint32_t num_data_nodes; - if (!file_read_uint32(file, &num_data_nodes)) + if (!file_read_uint32(file, &num_data_nodes)) { goto exit_trie_created; + } trie_data_array_resize(trie->data, num_data_nodes); log_debug("num_data_nodes=%d\n", num_data_nodes); - uint32_t tail_ptr; - uint32_t data; trie_data_node_t data_node; - for (i = 0; i < num_data_nodes; i++) { - if (!file_read_uint32(file, &tail_ptr) || - !file_read_uint32(file, &data)) - goto exit_trie_created; - data_node.tail = tail_ptr; - data_node.data = data; - trie_data_array_push(trie->data, data_node); + buf_size = num_data_nodes * sizeof(uint32_t) * 2; + buf = malloc(buf_size); + if (buf == NULL) { + goto exit_trie_created; } + if (file_read_chars(file, (char *)buf, buf_size)) { + buf_ptr = buf; + for (i = 0; i < num_data_nodes; i++) { + data_node.tail = (int32_t)file_deserialize_uint32(buf_ptr); + buf_ptr += sizeof(uint32_t); + data_node.data = (int32_t)file_deserialize_uint32(buf_ptr); + buf_ptr += sizeof(uint32_t); + + trie_data_array_push(trie->data, data_node); + } + } + + free(buf); + uint32_t tail_len; - if (!file_read_uint32(file, &tail_len)) + if (!file_read_uint32(file, &tail_len)) { goto exit_trie_created; + } uchar_array_resize(trie->tail, tail_len); trie->tail->n = tail_len; - if (!file_read_chars(file, (char *)trie->tail->a, tail_len)) + if (!file_read_chars(file, (char *)trie->tail->a, tail_len)) { goto exit_trie_created; + } return trie;