+ -
当前位置:首页 → 问答吧 → 求优化

求优化

时间:2011-12-03

来源:互联网

请各位大侠指点,这是线程中一段代码,请问什么地方还可以继续优化,提高代码执行速度
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;
}

作者: sky_ghm   发布时间: 2011-12-03

for(i = 0; i < pmsg->dwDatLen; i++)
{
str_data.Format(_T("%-2x "),pmsg->ucDat[i]);
str += str_data;


我感觉这一块可以优化一点,因为format函数要考虑很多的事情,俺自己写一个专用的,也许会快。

作者: jennyvenus   发布时间: 2011-12-03

C/C++ code
先准备好一个全局的表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;
    }
}

俺就自己写过一个方法,快不快俺也不知道。

作者: jennyvenus   发布时间: 2011-12-03