__GYT 2015-01-15 08:24 采纳率: 0%
浏览 688

帮忙看一下这个DataDeal函数有啥好办法优化吗?

 void DataDeal(char* data, int size)
{
    int32_t index = 0;
    int32_t start = 0;
    int32_t end = 0;

    for(;index <= size;)
    {
        if (!start)
        {
            if (data[index++] == 0x00 
                && data[index++] == 0x00 
                && data[index++] == 0x00
                && data[index++] == 0x01)
            {
                start = index;
            }
        }

        if (!end)
        {
            if (data[index++] == 0x00 
                && data[index++] == 0x00 
                && data[index++] == 0x00
                && data[index++] == 0x01)
            {
                end = index -4 ;
            }
        }

        if (start && end)
        {

            int32_t size = end-start;
            char* pp = (char*)&size; 
            memcpy(data+start-1, pp, 1);
            memcpy(data+start-2, pp+1, 1);
            memcpy(data+start-3, pp+2, 1);
            memcpy(data+start-4, pp+3, 1);

            start = end+4;
            end = 0;
        }
    }

    end = size;
    int32_t size_s = end-start;
    if (size_s)
    {
        char* pp = (char*)&size_s; 
        memcpy(data+start-1, pp, 1);
        memcpy(data+start-2, pp+1, 1);
        memcpy(data+start-3, pp+2, 1);
        memcpy(data+start-4, pp+3, 1);
    }

    return;
}

void main()
{
char data[100]  = {0x00, 0x00, 0x00, 0x01, 0x63, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x63, 0x21, 0x63, 0x21, 0x00, 0x00, 0x00, 0x01, 0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x00, 0x00, 0x00, 0x01,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21,0x00, 0x00, 0x00, 0x01, 0x63, 0x21,0x63, 0x21,0x63, 0x21,0x63, 0x21, 0x63, 0x21,0x63,  0x21,0x63, 0x21, 0x00, 0x00, 0x00, 0x01};
    DataDeal(data, 65);
}

DataDeal函数是查找替换掉0x00, 0x00, 0x00, 0x01, 并将其数值修改为两个0x00, 0x00, 0x00, 0x01之间数据长度,并且按照打段顺序排列;
就目前来看 这个函数怎么样优化好些呢?

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-27 00:05
    关注

    该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

    这里有几个可以优化的地方:

    1. 避免重复读取相同的值:在原始代码中,每次检查起始标记和结束标记时,都是分别读取4个字节。可以将这些值缓存起来,避免重复读取。这样可以减少内存访问的开销。

    2. 使用指针操作代替数组下标:使用指针操作可以提高代码的可读性和执行效率。通过使用指针,可以避免对数组的重复索引操作。

    3. 使用位操作代替字节比较:由于标记值都是连续的字节,可以使用位操作来进行比较,而不是逐字节比较。这可以减少比较操作的次数。

    4. 减少内存拷贝次数:在原始代码中,对于每个匹配段,使用了多次内存拷贝操作。可以优化为一次内存拷贝操作,减少不必要的内存访问。

    下面是对DataDeal函数进行优化的修改示例:

    void DataDeal(char* data, int size)
    {
        int32_t* p_data = reinterpret_cast<int32_t*>(data);
        int32_t* p_start = nullptr;
        int32_t* p_end = nullptr;
    
        int32_t* p_data_end = reinterpret_cast<int32_t*>(data + size);
    
        while (p_data < p_data_end)
        {
            if (!p_start)
            {
                if (*p_data == 0x01000000)
                {
                    p_start = p_data;
                    p_data++;
                }
            }
    
            if (!p_end)
            {
                if (*p_data == 0x01000000)
                {
                    p_end = p_data - 1;
                }
            }
    
            if (p_start && p_end)
            {
                int32_t segment_size = static_cast<int32_t>(p_end - p_start) * sizeof(int32_t);
                *p_start = segment_size;
    
                // Shift the data by 3 bytes to the left
                memmove(p_start - 3, p_start, segment_size + sizeof(int32_t));
    
                p_start = nullptr;
                p_end = nullptr;
            }
    
            p_data++;
        }
    
        int32_t* p_start_last_segment = p_start;
        if (p_start_last_segment)
        {
            int32_t segment_size = static_cast<int32_t>(p_data_end - p_start_last_segment) * sizeof(int32_t);
            *p_start_last_segment = segment_size;
    
            // Shift the data by 3 bytes to the left
            memmove(p_start_last_segment - 3, p_start_last_segment, segment_size + sizeof(int32_t));
        }
    }
    

    这个优化版本避免了重复读取数据,使用指针操作代替了数组下标操作,并使用位操作进行比较。另外,优化后的版本在处理最后一个段时也进行了相应的修改。


    请注意,优化的效果可能因具体情况而异,最好在实际测试和比较之后再决定是否采纳这些修改。

    评论

报告相同问题?

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口