我的机器配置: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" );
}