最近在開發項目中使用了cjson這個C語言的json解析庫,但是在加載json文件時卻發現了一個問題,就是加載速度非常慢。
#include <cJSON.h> #include <stdio.h> int main() { const char* jsonFile = "example.json"; FILE* fp = fopen(jsonFile, "r"); if(fp == NULL) { printf("Failed to open file %s",jsonFile); return -1; } fseek(fp , 0 , SEEK_END); long fileSize = ftell(fp); rewind(fp); char* buffer = (char*) malloc(sizeof(char) * fileSize); fread(buffer, 1, fileSize, fp); fclose(fp); cJSON* root = cJSON_Parse(buffer); free(buffer); if(root == NULL) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return -1; } return 0; }
以上是我們代碼中加載json文件的代碼,其中我們首先打開json文件,然后讀取文件大小并分配內存,最后讀取文件內容到內存中。然后我們使用cjson庫的函數cJSON_Parse解析json數據。
我們注意到其中使用了malloc函數分配了內存,而讀取文件內容到內存中的操作也是一個比較耗時的操作。因此導致了這個代碼運行速度非常慢的情況。
為了解決這個問題,我們可以采用以下的解決方案:
int main() { const char* jsonFile = "example.json"; FILE* fp = fopen(jsonFile, "r"); if (fp == NULL) { printf("Failed to open file %s",jsonFile); return -1; } cJSON *root = cJSON_Parse_Stream(fp); fclose(fp); if(root == NULL) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return -1; } return 0; }
我們可以使用cJSON_Parse_Stream函數代替cJSON_Parse函數來解析json數據。cJSON_Parse_Stream函數的作用是從流中解析json數據,它不需要一次性把整個json數據讀入內存中,因此可以提高加載速度。
使用cJSON_Parse_Stream函數之后,我們就不需要調用malloc函數分配內存了,同時也不需要讀取文件內容到內存中。
最后,我們需要注意使用cJSON_Parse_Stream函數帶來的一個問題:如果我們的json文件內容并沒有以'\n'或EOF結尾,cJSON_Parse_Stream函數可能會一直等待直到超時。 因此,在使用cJSON_Parse_Stream函數時,一定要保證json文件內容以'\n'或EOF結尾。
上一篇vue 循環產生組件