2016-03-24 14 views
0

非常に大きなテキスト(> 50mb)があります。MFC。 RichEditCtrl内のすべてのマッチをすばやくハイライト表示

FindText,SetSelおよびSetSelectionCharFormatは私にとっては遅すぎます。 テキストを定式化して表示しようとしましたが、それはさらに遅くなりました。

メモリにRichEditCtrlを使用して作業することはできますか? または、最初のオプションをスピードアップするか、別の方法で問題を解決できますか?

+0

(1)通常、多くのマッチがありますか? (2)マッチが1つだけの場合、それは速いですか? (3)ハイライトせずに 'FindText'だけを実行すれば、十分高速ですか? 3つの質問すべてに対する回答が「はい」の場合、この検索の期間、ウィンドウの更新を無効にしようとします。 –

+0

@VladFeinstein それは動作します!ありがとう!これは20-50%の速度増加をもたらした。 ファイル56メガバイトの場合、関数は機能します: 'FindTextA' - 21.6 s; 'FindTextA' +' SetSel' - 23.3秒; 'FindTextA' +' SetSel' + 'SetSelectionCharFormat' - 130秒です。 'FindTextA'と' SetSelectionCharFormat'のスピードアップが可能ですか? –

+0

(1)あなたは通常、多くの試合を見かけますか? (2)マッチが1つだけの場合、それは速いですか? (3)あなたは大文字と小文字の両方にマッチしますか? –

答えて

1

私の改善の測定値はあなたのものとは異なります。私は「Loremのイプサム」テキストの3,000コピー(ファイルサイズ1379キロバイト)のファイルでそれをテストしている

void CRichEditAppView::OnEditHighlight() 
{ 
    FINDTEXTEX ft = {}; 
    ft.chrg = { 0, -1 }; 
    ft.lpstrText = L"Lorem ipsum"; 
    DWORD dwFlags(FR_DOWN); 
    CHARFORMAT2 cf = {}; 
    cf.cbSize = sizeof cf; 
    cf.dwMask = CFM_BACKCOLOR; 
    cf.crBackColor = RGB(255, 255, 0); 
    CRichEditCtrl& ctrl = GetRichEditCtrl(); 
    ctrl.HideSelection(TRUE, FALSE); 
    ctrl.SetRedraw(FALSE); 
    int count(0); 
    while (ctrl.FindTextW(dwFlags, &ft) >= 0) 
    { 
     ctrl.SetSel(ft.chrgText); 
     ctrl.SetSelectionCharFormat(cf); 
     ft.chrg.cpMin = ft.chrgText.cpMax + 1; 
     count++; 
    } 
    ctrl.HideSelection(FALSE, FALSE); 
    ctrl.SetRedraw(TRUE); 
    ctrl.Invalidate(); 
} 

は、ここに私のコードです。

(「HideSelection()」と「SetRedraw()」を呼び出さない)「素朴な」実装には11秒かかりました。

HideSelection()を呼び出すと、9秒に短縮され、SetRedraw()〜1.2秒が加算されます。だから、私は10倍の改善が見込まれます。

ちょうど私がSetSelectionCharFormat()への呼び出しを取り除くと、私は0.4秒しか保存しません。

関連する問題