2012-10-28 56 views
0

我在寫一個自定義函數來獲取XML文件中的所有標籤。我使用這個代碼:在XML文件中搜索標籤的優化

wchar_t *GetLine(wchar_t *fileName=L"indexing.xml", wchar_t endSymbol = '\n') 
{ 
    SetFilePointer(hReadFile,sizeof(wchar_t) * position, NULL, FILE_BEGIN); 
    int size; 
    wchar_t wchr[1]; 
    DWORD dw; 
    size = 0; 
    do 
    { 
     ReadFile(hReadFile, wchr, sizeof(wchar_t), &dw, NULL); 
     if(!dw) 
     { 
      break; 
     } 
     tempGetLine[size] = wchr[0]; 
     size++; 
    }while(wchr[0] != endSymbol); 
    tempGetLine[size] = '\0'; 
    position += (size); 
    return tempGetLine; 
} 
wchar_t *GetTag(wchar_t *fileName = L"indexing.xml") 
{ 
    wchar_t *temp = GetLine(fileName,'>'); 
    int i = 0; 
    while(*temp != '\0') 
    { 
     tempTag[i] = *temp; 
     i++; 
     temp++; 
    } 
    tempTag[i] = '\0'; 
    return tempTag; 
} 

它的工作原理,但在一個大文件中,它需要大量的迭代。我如何優化我的代碼?

+0

爲什麼當它沒有對它做任何事情時將文件名傳遞給'GetLine()'?它只是使用'hReadFile',它可能是一個包含已經打開的文件句柄的全局變量。 –

+0

@j_random_hacker你是對的,我的錯,但它與快速編碼沒有任何關係 – abilash

+0

你是否考慮轉向真正的XML解析器。對於原始速度,SAX解析器非常好,否則就有一些輕量級DOM解析器可以使用(我個人推薦[ticpp](http://code.google.com/p/ticpp/)) –

回答

0

它看起來像你打電話SetFilePointer()每一個標籤。如果您在對GetTag()的調用之間沒有進行任何其他讀取或寫入文件,則根本不要打電話SetFilePointer()。這是沒有必要的,而且這個調用可能會減少操作系統執行的緩衝量。

+0

我已經嘗試過,但沒有提供必要的結果。 – abilash

+2

這可能是因爲ReadFile()引起每個單字符的內核轉換。通常人們使用'fopen()'和'fgetc()'來讀取文件,而不是操作系統提供的函數 - 這具有(a)便攜性和(b)在用戶空間中發生緩衝的雙重好處*意味着可以有效地讀取單個字符。 –

+0

你是對的ReadFile()會導致每次調用的內核轉換。這是否意味着WriteFile()具有相同的行爲? – abilash