请各位大侠指点,这是线程中一段代码,请问什么地方还可以继续优化,提高代码执行速度
int EM9170_CAN::PackagePro( char* Buf, int len )
{
// 对接收的数据进行处理,这里为简单的数据回发
int i1;
PCAN_PACKET  pmsg;
CString str;
double df_time;
CString str_data;
int i; pmsg = (PCAN_PACKET)Buf;


DWORD Ms_timer;
Ms_timer = GetTickCount();
if(0 == First_Recv_Flag)
{
df_time = 0.0010;
First_Time = Ms_timer;
First_Recv_Flag = 1;
m_count_Recv = 0;
    My_Max_Count = 0;
m_Str = _T("");
str = _T("   0.000000 Start of measurement\r");
m_FRecordFile.Seek(0,CFile::end);
    m_FRecordFile.WriteString( str ); }
else
{
df_time = (double)((Ms_timer - First_Time) / 1000.000);
}
if(pmsg->dwID > 0x7ff)
{
str.Format(_T("%11.6f 1  %Xx        RX   d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
}
else
{
str.Format(_T("%11.6f 1  %-16XRX   d %d "),df_time,pmsg->dwID,pmsg->dwDatLen);
} for(i = 0; i < pmsg->dwDatLen; i++)
{
str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
str += str_data;
}

m_count_Recv ++;
if(m_count_Recv >= FRAME_BUF_LEN)
{
str += _T("\r");
    m_Str += str;
    m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( m_Str);

m_Str = _T("");
m_count_Recv = 0;
My_Max_Count++;
if(My_Max_Count > MAX_COUNT)
{
str = _T("End TriggerBlock\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str );
m_FRecordFile.Close();
m_count_Recv = 0; if(m_File_Num < MAX_FILE)
{
m_File_Num ++;
First_Recv_Flag = 0;
My_Max_Count = 0; CString File_Name = _T("");
CString PointFile;
File_Name.Format(_T("%d"), m_File_Num);
if(1 == m_Can_Num)
{
 PointFile = _T("\\USBDisk\\CAN1RecordData") + File_Name + _T(".txt");
}
else
{
 PointFile = _T("\\USBDisk\\CAN2RecordData") + File_Name + _T(".txt");
}

m_FRecordFile.Open(PointFile,CFile::modeCreate| CFile::modeWrite); CString str_head = _T("date Sun Oct 16 06:09:42 pm 2011\r\nbase hex  timestamps absolute \r\ninternal events logged \r\nBegin Triggerblock Sun Oct 16 06:09:42 pm 2011\r");
m_FRecordFile.Seek(0,CFile::end);
m_FRecordFile.WriteString( str_head );
}
else
{

   AfxMessageBox(_T("文件记录超出范围请保存后重新开始程序"));
   CloseCAN( );  /*关闭can接收*/
   m_Error_Flag = 1;
}            
}    
}
else
{
str += _T("\r\n");
m_Str += str;
}
return i1;
}

解决方案 »

  1.   

    for(i = 0; i < pmsg->dwDatLen; i++)
    {
    str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
    str += str_data;
    } 我感觉这一块可以优化一点,因为format函数要考虑很多的事情,俺自己写一个专用的,也许会快。
      

  2.   

    先准备好一个全局的表g____hex2str
    for( i = 0; i < 0x100; i++ )
    {
    _stprintf( g____hex2str + i * 3, _T( "%.2X " ), i );
    }

    //**************************************
    // HEX转16进制数
    // 有空格
    //**************************************
    TCHAR *
    hex2str( unsigned char *hexdata, size_t length, TCHAR *strbuffer )
    {
    size_t i;
    TCHAR *p; if( strbuffer )
    {
    *strbuffer = 0;
    }
    else
    {
    //如果传入一个空串,返回一个错误信息
    return g____NULL_STRING;
    } //查表法
    TCHAR *q;
    //int j; p = strbuffer;
    for( i = 0; i < length; i++ )
    {
    q = g____hex2str;
    q += *hexdata;
    q += *hexdata;
    q += *hexdata;
    //j = ( unsigned char )( *hexdata );
    //j <<= 1;
    //j += ( unsigned char )( *hexdata );
    memcpy( p, q, 3 * sizeof( TCHAR ) );
    p += 3;
    hexdata++;
    }
    *p = 0;
    }
    }
    俺就自己写过一个方法,快不快俺也不知道。
      

  3.   

    格式化字符串, 楼上说了方法
    动态分配的字符串CString, 可以用CHAR []
    文件写入, 可以累积到一定程度再写入
    如果还要优化, 可以用整数模拟浮点运算
      

  4.   

    呵呵!比较懒,g____hex2str这个表有没有啊
      

  5.   

    你最后文件操作的地方好像没有看到你文件的Close()操作
      

  6.   

    把所有字符串的 + 操作都不要用, Format也不要用, 这样就会快得多的了.
    字符串的所有操作用C标准库来完成吧.