• 4772阅读
  • 6回复

[讨论]qt执行速度问题,4种写法对比 [复制链接]

上一主题 下一主题
离线hitler++
 

只看楼主 倒序阅读 楼主  发表于: 2012-02-19
测试环境:
win7
8G内存
I7 2600 4核8线程CPU

qt4.7.4   php5.3.8   python 2.6

qt下执行
  1. QTime t;
  2.     t.start();
  3.     QString aa="";
  4.     for(int i=0;i<=1000000;i++){
  5.         aa += "1";
  6.     }
  7.     printf("消耗时间: %d 毫秒", t.elapsed());

debug 下耗时:平均240毫秒
release下耗时:平均138毫秒

php下执行
  1. $time = new runtime;
  2. $time->start();
  3. $str = "";
  4. for ($i = 0; $i <= 1000000; $i++) {
  5.     $str.="1";
  6. }
  7. $time->stop();
  8. echo "使用时间:" . $time->spent() . "毫秒";
平均消耗时间:92.9毫秒

python下执行
  1. import os,sys
  2. from time import clock as now
  3. start = now()
  4. str = ""
  5. for i in range(0,1000000):
  6.     str += "i"
  7. finish = now()
  8. print (finish-start)
平均消耗时间:210毫秒

C++代码执行:
  1. QTime t;
  2.     t.start();
  3.     char *pStr = new char[1000001];
  4.     for(int i=0;i<=1000000;i++){
  5.         pStr[i] = '1';
  6.     }
  7.     delete pStr;
  8.     printf("消耗时间: %d 毫秒",t.elapsed());
debug下,平均3毫秒
release下,平均1毫秒

不止这一种测试,每次测试速度都只能比python快那么点,连php一半的速度都达不到,是我qt配置问题还是什么问题.
比纯c++代码甚至慢上了几百倍,求解,这是一个非常严重的问题








离线roywillow

只看该作者 1楼 发表于: 2012-02-19
先调用一下QString::reserve()一下试试呢?
另外也可以参考一下QString文档的More Efficient String Construction部分
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线jdwx

只看该作者 2楼 发表于: 2012-02-19
QString本身就是个STL的list,动态分配内存本身就很费时间。
你可以用C写个list试试看速度怎么样。
和C++的数组最相似的是STL的vector,一次分配全部的内存。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线ffii4455

只看该作者 3楼 发表于: 2012-02-19
回 2楼(jdwx) 的帖子
同意楼上的说法你纯C++中的代码,内存空间是一次分配好的,而且是连续的内存空间
离线hitler++

只看该作者 4楼 发表于: 2012-02-20
我试了下 reserve(),好像什么变化也没有
离线hitler++

只看该作者 5楼 发表于: 2012-02-20
同样,我试了改成标准库的 std::string ,debug下能跑到26毫秒,release下6毫秒
离线hitler++

只看该作者 6楼 发表于: 2012-02-20
我又用string类和qstring写了相同一个功能的字符串处理函数,但是我却发现2个函数执行速度相差很小,平均50毫秒,string类,大概只能快5毫秒左右
快速回复
限100 字节
 
上一个 下一个