风中的流沙

萋萋少年讨江湖,亦真亦幻总虚度。风卷流沙落天涯,缘起缘灭任追逐。

导航

<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

留言簿(94)

随笔档案

文章档案

相关链接

搜索

最新评论

阅读排行榜

评论排行榜

怎样改才能使move的效率高一些?

我的机器配置:CII 1G/256M/Win2K Pro ,测试=8×20的时候就停摆了。
怎样才能使 move 函数的效率高一些,注:vector是铁定要用的了。

/*==============================================================================
文件: vaTest.cpp
说明:模拟机数据测试
时间:2006-03-08
编写:oshj | oshj@21cn.com
环境:VC6.0/Windows2000/1024*768分辨率
特别说明:
==============================================================================*/
#include <stdio.h>
#include <vector>
using namespace std;

typedef vector<int> vi;
typedef vector<vi>  vii;

void move(vii *p,vii *q)
{
 int index,i,j,m,k;
 int pSize;
 vi  v,t1,t2;
 vii qn;
 
 pSize = p->size();
  index = 0;
  while( index<pSize )
  {
    if( q->size()<=0 )
    {
      t1 = p->at(index);
      t2 = p->at(index+1);
      for( i=0;i<t1.size();i++ )
      {
        for( j=0;j<t2.size();j++ )
        {
          v.clear();
          v.push_back( t1.at(i) );
          v.push_back( t2.at(j) );
          q->push_back( v );
          v.clear();
        }
      }
   //////////////
      index+=2;
   //////////////
    }
    else
    {
      ////////////////////////////////
      t1 = p->at(index);
      for( i=0;i<t1.size();i++ )
      {
        for( j=0;j<q->size();j++ )
        {
          v.clear();
          v.push_back( t1.at(i) );
          for( k=0;k<q->at(j).size();k++ )
          {
            v.push_back( q->at(j).at(k) );
          }
          qn.push_back( v );
          v.clear();
        }
      }

      //////////////
      //临时交换保存
      for( j=0;j<q->size();j++ )
        q->at(j).clear();
      q->clear();
      for( m=0;m<qn.size();m++ )
          q->push_back( qn.at(m) );
      qn.clear();
      //////////////
      index++;
      ////////////////////////////////

   } // end here else
  } //end here while( index<pSize )

}

//hs: High Start
//ls: Low  Start
//hd: High End
//ld: Low  End
//nh: Number of High
//nl: Number of Low
long hs,ls,hd,ld,nh,nl;

void GetTimeFreq()
{
 __asm             
 {
  RDTSC
  mov hs, edx
  mov ls, eax
 }
}

void GetTimeDiff(float Frq)
{
 
 long hd,ld;
 long nh,nl;

 __asm
 {
  RDTSC
  mov hd, edx
  mov ld, eax   ;获取两次计数器值得差
  sub eax,ls
  cmp eax,0    ;如果低32的差为负则求返,因为第二次取得永远比第一次的大
  jg  L1
  neg eax
  jmp L2
    L1: mov nl, eax
    L2: sbb edx, hs
  mov nh, edx 
 }

  //把两个计数器值之差放在一个64位的整形变量中
  //先把高32位左移32位放在64的整形变量中,然后再加上低32位
 __int64  timer =(nh<<32) + nl;
 //输出代码段运行的时钟周期数
 //以频率1.0G cpu为例,如果不是将Frq改为其它
 if( Frq<=0.00 ) Frq=1.0;
 printf( "总耗时:%f\r\n",(double)(timer/Frq/1000000000) );

}

void main()
{
 int i,j,iCount,jCount;
 vi v;
 vii p,q;
 char sMsg[500]={'\0'};
 char sTmp[255]={'\0'};
 float fRq;
 int iPrint=0;

 printf( "输入初始序列数量(>=2):" );
 scanf( "%d",&iCount );
 printf( "每序列初始元素量(>=1):" );
 scanf( "%d",&jCount );
 printf( "初始计算因子:1\r\n\r\n" );

 printf( "测试机器的CPU频率是(GHz):" );
 scanf( "%f",&fRq );
 printf( "打印详细组合数据吗?(0: 是  1: 否):" );
 scanf( "%d",&iPrint );

 if( iCount<2 || jCount<1 ) return;

 for( j=1;j<=jCount;j++ )
  v.push_back( j );

 for( i=0;i<iCount;i++ )
  p.push_back( v );

 v.clear();

 //--------------------------------------
 printf( "================================\r\n" );
 printf( "输入序列总数:%d\r\n",p.size() );

 for( i=0;i<p.size();i++ )
 {
  sprintf( sMsg,"序列%02d: ",i );
  for( j=0;j<p.at(i).size();j++ )
  {
   sprintf( sTmp,"%d ",p.at(i).at(j) );
   strcat( sMsg,sTmp );
  }
  printf( sMsg );
  printf( "\r\n" );
 }
 printf( "================================\r\n" );

 //--------------------------------------
 GetTimeFreq();

 move( &p,&q );  //循环将p放入q

 GetTimeDiff( fRq );
 //--------------------------------------
 //总记录
 printf( "q.size()=%d\r\n",q.size() ); 
 //打印详细组合数据
 if( iPrint==0 )
 {
  for( i=0;i<q.size();i++ )
  {
   sprintf( sMsg,"q.at(%d)=",i );
   for( j=0;j<q.at(i).size();j++ )
   {
    sprintf( sTmp,"%d",q.at(i).at(j) );
    strcat( sMsg,sTmp );
    if( j!=q.at(i).size()-1 )
     strcat( sMsg,"*" );
   }
   strcat( sMsg,"\r\n" );
   printf( sMsg );
  }
 }
 //--------------------------------------
 for( i=0;i<p.size();i++ )
  for( j=0;j<p.at(i).size();j++ )
   p.at(i).clear();
 p.clear();

 for( i=0;i<q.size();i++ )
  for( j=0;j<q.at(i).size();j++ )
   q.at(i).clear();
 q.clear();
 //--------------------------------------

 printf( "\r\ntest over\r\n" );


}

posted on 2006-03-09 14:11 风中的一粒流沙 阅读(3093) 评论(4)  编辑 收藏

评论

# 急啊 2006-03-09 14:13 风中的一粒流沙

欢迎各位老鸟斧正 !

# re: 代码好长 ^_^ 2006-03-09 14:52 清风雨

比较懒惰,一般不是很习惯看长代码。
不过,你有个接口倒是可以考虑一下。

对于数据块的,不妨考虑insert :
v.insert( v.begin(),mem,mem+56 );///mem可以是内存指针或iterator

# :-) 2006-03-09 15:19 风中的一粒流沙

insert 比 push_back 快吗?
我试试看
3ks

# re: 应该来说还有一点 2006-03-09 16:17 清风雨

最好是,如果可以先reserve一下,可以避免多次内存分配和copy。

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]