在下遇到关于CListCtrl效率方面的问题。
    具体描述如下:
    在下想在9个list控件中每个插入2000行,在下测了一下,每一个List控件插完需要零点三几秒,全部插完需要3秒左右。
    我的目前解决方法是,先用SetItemCount(),在用一个辅助线程调用InsertItem()函数为控件插值。
    各位大侠谁有更好的解决方法,提供给在下,高分相赠!!!

解决方案 »

  1.   

    用SetItemCountEx(..., LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL)试一下呢,看会不会快些
      

  2.   

    .SetRedraw(FALSE);
    ...
    SetRedraw(TRUE);
      

  3.   

    5.3 如何提高应用程序的性能
    在应用程序初始化时进行缓冲。尽管用户一直在抱怨系统启动太慢,但是启动的时候用户耐性比程序运行中好。建议把消耗用户耐心的操作尽可能的放在启动时执行。
    尽量少的加载数据。通常只显示用户看到的数据,或者将不重要的数据延缓显示。有时要缓存用户经常查看的数据。常用的技巧有哈希表、分页、缓冲和虚列表。哈希表又名散列,在查找和映射算法中性能较好。例如MFC的窗口过程用了哈希表来缓存消息对应的函数指针。在数据库程序中分页有广泛应用,建议虚列表缓冲的对象是被经常查看的第一页和最后一页。缓冲通常可以节省查询的次数。在VC用户手册中的“Virtual List Controls”这篇文章描述了虚列表的用法和注意事项。
    打开编译器的优化功能。尽管这偶尔会造成程序工作不正常,但是只要找到优化错误的文件,关闭文件对应的优化就可以绕过这个问题了。部分CPU厂商,例如Intel,提供优化过编译库。可以使用这些库来提高产品在特定硬件上的性能。
    用机器码来编写时间敏感模块。当然,开始的时候可以用C++版本的代码来验证算法的正确性。机器码只是作为C++版本的代码的优化版本。
    用单独的线程,或在长时间的运算中增加消息检查和分发代码来提高用户操作反应速度。
    如果参数取值是固定的,那么编写对应的版本来调用会快得多。CByteArray, CDWordArray就是这样的模块。
    不用期待inline关键字可以大幅度提高性能。Inline关键字在微软的C++编译器中基本上是无效的。
    不要耗尽物理内存。内存不足时虚拟内存页面交换会大量占用CPU时间。
    尽管效率没有提高,但是减少用户操作反应时间,以及经常通知操作进度可以有效的削减用户的不满度。在用户快要不耐烦的时候增加进度条的进度,或者放一个动画告诉用户“嘿,我在工作,不要按Control+Alt+Del!”,或者在操作开始之后告诉用户“你可以出去泡杯茶了”。举例来说,Windows98启动时用了一个动画,Windows2000用了两个进度条来让你耐心等待。在编写程序的时候,通常的做法是在对话框、列表视图控件或者控制栏中创建一个进度条或者一个动画控件。如果你不想编写自己的进度更新界面,那么你可以用IE内建的进度显示组件。可以用IID_IProgressDialog来创建这个组件并且查询其IProgressDialog接口来设置标题、进度、状态和动画。微软知识库文章Q260222 BUG: PROGDLG_NOMINIMIZE Flag in IProgressDialog::StartProgressDialog() Has No Effect 中有一个该组件的使用示例。
    With关键字虽然在C++中不存在,但你还是可以用引用来减少取地址操作的次数。一些其他的技巧包括用位操作替代加减法和乘除法等等。
      

  4.   

    我也是使用
    SetRedraw(FALSE);
    ...
    SetRedraw(TRUE);