非常に大きなテキスト(> 50mb)があります。MFC。 RichEditCtrl内のすべてのマッチをすばやくハイライト表示
FindText
,SetSel
およびSetSelectionCharFormat
は私にとっては遅すぎます。 テキストを定式化して表示しようとしましたが、それはさらに遅くなりました。
メモリにRichEditCtrl
を使用して作業することはできますか? または、最初のオプションをスピードアップするか、別の方法で問題を解決できますか?
非常に大きなテキスト(> 50mb)があります。MFC。 RichEditCtrl内のすべてのマッチをすばやくハイライト表示
FindText
,SetSel
およびSetSelectionCharFormat
は私にとっては遅すぎます。 テキストを定式化して表示しようとしましたが、それはさらに遅くなりました。
メモリにRichEditCtrl
を使用して作業することはできますか? または、最初のオプションをスピードアップするか、別の方法で問題を解決できますか?
私の改善の測定値はあなたのものとは異なります。私は「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秒しか保存しません。
(1)通常、多くのマッチがありますか? (2)マッチが1つだけの場合、それは速いですか? (3)ハイライトせずに 'FindText'だけを実行すれば、十分高速ですか? 3つの質問すべてに対する回答が「はい」の場合、この検索の期間、ウィンドウの更新を無効にしようとします。 –
@VladFeinstein それは動作します!ありがとう!これは20-50%の速度増加をもたらした。 ファイル56メガバイトの場合、関数は機能します: 'FindTextA' - 21.6 s; 'FindTextA' +' SetSel' - 23.3秒; 'FindTextA' +' SetSel' + 'SetSelectionCharFormat' - 130秒です。 'FindTextA'と' SetSelectionCharFormat'のスピードアップが可能ですか? –
(1)あなたは通常、多くの試合を見かけますか? (2)マッチが1つだけの場合、それは速いですか? (3)あなたは大文字と小文字の両方にマッチしますか? –