• 12730阅读
  • 21回复

[提问]关于QTextEdit的性能,这么简单的例子,百思不得其解。 [复制链接]

上一主题 下一主题
离线tthheedhz
 
只看楼主 正序阅读 楼主  发表于: 2012-05-10
下面是一个简单的例子,

te.show()这句代码之前,占用大量cpu,是正常的,是肯定的。因为有大量的append操作。


那么,为什么:
当代码te.show()被执行之后后,程序依然占用大量的cpu资源?

打开任务管理器,可以明显看到,此程序的cpu还在不停地运算着。

到底te.show()被执行后,cpu还在大量地运算什么?

注意:鼠标焦点要落在程序上,不要落在任务管理器上,才能有明显的效果。就是说,需要点击一下程序的界面,就会发现,cpu大量彪升。




#include <QtGui>
int main(int argc,char*argv[])
{
    QApplication app(argc,argv);  

    QTextEdit te;
    te.resize(500,500);
    QString s;
    for(int i=0;i<100000;i++)   {  s.append(QString::number(i)+"-<font color=red size=50>Hello</font>-"); }

   te.setHtml(s);
   te.show();

    return app.exec();
}



离线icosagon

只看该作者 21楼 发表于: 2012-05-11
另外,如果不需要编辑的话可以用QTextBrowser,这个不会出现光标,不会因为光标重绘引起cpu猛升


也可用QTextEdit 的方法setReadOnly
离线icosagon

只看该作者 20楼 发表于: 2012-05-11
ms office word 2010拷贝完后一样卡的要死。






10万条html数据,应该多分几页

离线jdwx

只看该作者 19楼 发表于: 2012-05-10
回 18楼(tthheedhz) 的帖子
我没发现有什么办法。
我也是偶然才发现的,画背景的时候发现的。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线tthheedhz
只看该作者 18楼 发表于: 2012-05-10
引用第17楼jdwx于2012-05-10 15:35发表的  :
这个就是结果,一秒大概两次。

你是说,这个重绘操作,每秒两次?

如果是这样,有没有办法解决?

如果不能,QTextEdit性能也太差了吧?
离线jdwx

只看该作者 17楼 发表于: 2012-05-10
这个就是结果,一秒大概两次。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线tthheedhz
只看该作者 16楼 发表于: 2012-05-10
引用第12楼jdwx于2012-05-10 14:21发表的  :
因为光标再闪。
闪一次,重绘一次。


我不但测试了word2010,还测试了记事本、写字板,这些软件的光标,也会闪,为什么就不占cpu资源呢?

QTextEdit的光标闪动,却占如此大量的cpu资源?



离线tthheedhz
只看该作者 15楼 发表于: 2012-05-10
引用第12楼jdwx于2012-05-10 14:21发表的  :
因为光标再闪。
闪一次,重绘一次。


有什么办法解决吗?
离线tthheedhz
只看该作者 14楼 发表于: 2012-05-10
引用第12楼jdwx于2012-05-10 14:21发表的  :
因为光标再闪。
闪一次,重绘一次。


闪动光标,也要重绘整个控件,是不是太浪费cpu资源了吧?


离线tthheedhz
只看该作者 13楼 发表于: 2012-05-10
引用第12楼jdwx于2012-05-10 14:21发表的  :
因为光标再闪。
闪一次,重绘一次。


不会吧?就是这个原因?

闪动也要重绘整个控件?

为什么word2010不会呢?
离线jdwx

只看该作者 12楼 发表于: 2012-05-10
因为光标再闪。
闪一次,重绘一次。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线tthheedhz
只看该作者 11楼 发表于: 2012-05-10
Re:Re:Re:回 3楼(tthheedhz) 的帖子
引用第10楼lejcey于2012-05-10 13:56发表的 Re:Re:回 3楼(tthheedhz) 的帖子 :
具体我不太清楚,当我把程序暂停的时候,可以看到QT还有很多eventloop在工作,我想和qt的机制有关吧。
话说,研究这个问题有意义吗?
.......

因为我做“优化”。
eventloop这些工作,按常理,不会占用太多的cpu资源,只会占些许的cpu资源。

如果你的机子慢,你可以尝试5万个,不要用10个那么多。

我认为,te.show()这句代码执行之后,程序是不应该再继续占用大量cpu资源的。


离线lejcey

只看该作者 10楼 发表于: 2012-05-10
Re:Re:回 3楼(tthheedhz) 的帖子
引用第7楼tthheedhz于2012-05-10 13:46发表的 Re:回 3楼(tthheedhz) 的帖子 :
我鼠标不点击,键盘不操作,反正,什么都不动,它依然占用大量cpu资源。
按常理,我什么都不动,应该只占用很少的cpu资源。为什么占用了10%的cpu资源那么多?
.......

具体我不太清楚,当我把程序暂停的时候,可以看到QT还有很多eventloop在工作,也就是QT一直在捕获消息进行处理,而windows 控件应该是直接忽略了吧,我想和qt的机制有关吧。

水平有限,呼唤高手!


话说,研究这个问题有意义吗?



离线tthheedhz
只看该作者 9楼 发表于: 2012-05-10
引用第2楼lejcey于2012-05-10 13:28发表的  :
10万个带格式的-<font color=red size=50>Hello</font>-?这就是放在word2003也很慢啊,有必要做这种压力测试吗?这都几十M的数据了,任何编辑器都慢啊。
你以为这是sql插入10万条记录啊。
程序一开始就调用10万次append,要知道,每N次append,都有可能涉及重新分配内存等大量内存操作的问题。我把文本复制到word中时,10分钟word都没反应。
.......



你理解错了我的意思。

te.show()这句代码之前,占用大量cpu是正常的,是肯定的。

我的问题是:te.show()这句代码之后,为什么依然占用大量的cpu资源?

离线tthheedhz
只看该作者 8楼 发表于: 2012-05-10
Re:回 3楼(tthheedhz) 的帖子
引用第6楼lejcey于2012-05-10 13:42发表的 回 3楼(tthheedhz) 的帖子 :
当你点击鼠标,或者移动鼠标的时候,QT会捕获这些消息并进行处理,从而实现复制粘贴、超链接下划线、获取当前光标,取出当前选中的内容等实现。QT的控件不能和word比的,word至少文档是分页了的,按页处理就不必每次都索引一遍,你可以看看源代码,对QT的这个控件进行一些改造,然后提交给官方,造福广大qt使用者。
[表情]  

我已经把把word2010设置成“不分页”的模式了。

拷贝这十万个东西进word2010后,拷贝完毕后,word2010就不再占cpu资源了。任务管理器的CPU显示:00。



离线tthheedhz
只看该作者 7楼 发表于: 2012-05-10
Re:回 3楼(tthheedhz) 的帖子
引用第6楼lejcey于2012-05-10 13:42发表的 回 3楼(tthheedhz) 的帖子 :
当你点击鼠标,或者移动鼠标的时候,QT会捕获这些消息并进行处理,从而实现复制粘贴、超链接下划线、获取当前光标,取出当前选中的内容等实现。QT的控件不能和word比的,word至少文档是分页了的,按页处理就不必每次都索引一遍,你可以看看源代码,对QT的这个控件进行一些改造,然后提交给官方,造福广大qt使用者。
[表情]  


我鼠标不点击,键盘不操作,反正,什么都不动,它依然占用大量cpu资源。

按常理,我什么都不动,应该只占用很少的cpu资源。为什么占用了10%的cpu资源那么多?




离线lejcey

只看该作者 6楼 发表于: 2012-05-10
回 3楼(tthheedhz) 的帖子
当你点击鼠标,或者移动鼠标的时候,QT会捕获这些消息并进行处理,从而实现复制粘贴、超链接下划线、获取当前光标,取出当前选中的内容等实现。QT的控件不能和word比的,word至少文档是分页了的,按页处理就不必每次都索引一遍,你可以看看源代码,对QT的这个控件进行一些改造,然后提交给官方,造福广大qt使用者。
离线tthheedhz
只看该作者 5楼 发表于: 2012-05-10
引用第2楼lejcey于2012-05-10 13:28发表的  :
10万个带格式的-<font color=red size=50>Hello</font>-?这就是放在word2003也很慢啊,有必要做这种压力测试吗?这都几十M的数据了,任何编辑器都慢啊。
你以为这是sql插入10万条记录啊。
程序一开始就调用10万次append,要知道,每N次append,都有可能涉及重新分配内存等大量内存操作的问题。我把文本复制到word中时,10分钟word都没反应。
.......

其实,它慢,并无所谓。因为内容多,进行操作的时候,慢是肯定的。

问题是,不对它做任何操作,不对它做任何修改,QTextEdit依然占用cpu资源,这点我就不理解了。

我用其它编辑器做过类似的实验,例如:word2010、c#中的RichTextBox等等,都没有这种问题。


只要不对编辑器进行操作,按道理,是不可能占用大量的cpu资源的(即使编辑器里有几十MB的内容)。





离线tthheedhz
只看该作者 4楼 发表于: 2012-05-10
引用第2楼lejcey于2012-05-10 13:28发表的  :
10万个带格式的-<font color=red size=50>Hello</font>-?这就是放在word2003也很慢啊,有必要做这种压力测试吗?这都几十M的数据了,任何编辑器都慢啊。



我把这10万个东西,拷贝到word2010里,拷贝完成后,注意是“拷贝完成后”,word2010并不占cpu资源。

离线tthheedhz
只看该作者 3楼 发表于: 2012-05-10
引用第2楼lejcey于2012-05-10 13:28发表的  :
10万个带格式的-<font color=red size=50>Hello</font>-?这就是放在word2003也很慢啊,有必要做这种压力测试吗?这都几十M的数据了,任何编辑器都慢啊。


我不是说慢。我针对的问题是:程序没有动,为什么仍然占用cpu资源。到底在运算什么?
离线lejcey

只看该作者 2楼 发表于: 2012-05-10
10万个带格式的-<font color=red size=50>Hello</font>-?这就是放在word2003也很慢啊,有必要做这种压力测试吗?这都几十M的数据了,任何编辑器都慢啊。

你以为这是sql插入10万条记录啊。

程序一开始就调用10万次append,要知道,每N次append,都有可能涉及重新分配内存等大量内存操作的问题。我把文本复制到word中时,10分钟word都没反应。
离线tthheedhz
只看该作者 1楼 发表于: 2012-05-10
没有人帮忙调调?运行一下?
快速回复
限100 字节
 
上一个 下一个