簡體   English   中英

如何使我的C ++程序用於Trie結構構建更快?

[英]How can I make my C++ program for Trie structure construction faster?

我正在使用C ++。

我的程序讀取20萬行文本文件,並創建一個Trie結構。

我可以保存Trie還是比現在更快? 這是從文件讀取數據並構建結構的函數代碼。

void buildDictionary(pTrie* root, string name) {    
    wifstream r_dic;
    r_dic.imbue(locale("kor"));
    r_dic.open(name,ios::binary);
    if (r_dic.fail()) {
        cout << name << " open failed" << endl;
        exit(-1);
    }
    wchar_t wch[256];
    wstring p1, p2;
    while (r_dic >> wch >> p1 >> p2) {
        pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
        pt->addArche(wch);
    }
    r_dic.close();
}

以下是分析運行的結果。

分析數據

您的概要文件輸出表明,要優化的第一個區域是文件讀取。 特別:

wchar_t wch[256];
wstring p1, p2;
while (r_dic >> wch >> p1 >> p2) {
    pTrie* pt = (*root).insert(splitJamo(wch).c_str(), p1+L' '+p2);
    pt->addArche(wch);
}

這將重復讀取三個字符串。 wch被讀入一個字符數組,然后傳遞給splitJamo() ,該wstring返回一個wstring ,這需要分配內存。 這可能會有點慢,但是我不能告訴您,因為您沒有顯示splitJamo()的代碼。

您閱讀了p1p2並立即用空格將它們連接起來。 這是低效的:它們在輸入文件中被空格隔開,並且您分別讀取它們,為它們分配內存,然后將它們重新放回原處。

假設三個字符串出現在輸入文件的每一行中,我將這樣閱讀:

wchar_t wch[256];
wstring p1p2;
while (r_dic >> wch && std::getline(r_dic, p1p2)) {
    pTrie* pt = root->insert(splitJamo(wch), p1p2);
    pt->addArche(wch);
}

這一起讀取p1和p2,這應該是一個改進。 進一步的改進可能是使用getline()一次讀取整行,但是如果不看splitJamo()insert()的代碼,我們就無法分辨。

還要注意,我從insert()的第一個參數中刪除了c_str() ,因為我假設它可能需要一個wstring ,所以我們避免以這種方式構造一個新的。 但是,如果需要wchar_t* ,則可以放回c_str()

關於軟件性能斷言的一般規則是:無論您認為是程序性能問題的原因,都是錯誤的。 使用工具代替猜測。

在性能優化領域,第一個使用的工具是探查器。 選擇一個,在其控制下運行程序,然后分析探查器在熱點上的報告(如果難以理解,請向SO詢問,這是可預期的), 根據探查器的數據進行假設,根據假設更改程序,重新運行並重新測量,沖洗並重復直到您對改進感到滿意。

那里有許多探查器,它們集成到IDE(在MS visual Studio中,也許在XCode中是smth),集成在OS(Linux perf )或獨立(Intel VTune)中。

據我所知,您懷疑IO是速度慢的原因,但是您很可能錯了。 可能是內存分配效率低下,語言環境轉換,字符串操作過度使用等。只有探查器的確鑿證據是優化進展的最安全方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM