我有一个非常大的文字(> 50mb)。
FindText
,SetSel
和SetSelectionCharFormat
对我来说太慢了。
我试图制定文本,然后显示,但它甚至更慢。
我可以在内存中使用RichEditCtrl
然后只显示吗?
或者我可以加快第一个选项,或者你可以用另一种方式解决我的问题吗?
答案 0 :(得分:1)
我对改进的衡量标准与你的不同。
这是我的代码:
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();
}
我在一个包含3,000份“Lorem ipsum”文本(文件大小为1,379 KB)的文件上进行了测试。
“天真”的实现(不调用HideSelection()
和SetRedraw()
)花了11秒。
调用HideSelection()
将时间缩短为9秒,将SetRedraw()
添加到1.2秒。所以我希望看到10倍的改进。
比较一下,如果我删除了对SetSelectionCharFormat()
的电话,我只能节省0.4秒。