只需一行代码即可获得巨大的性能差异

时间:2014-03-26 02:38:47

标签: c++ performance

以下是代码的一些背景知识。

我正在开发一个能够通过CAN总线闪存ECU的项目,这个CAN_TransferData将被调用768次,CAN_messageProc(&msg, cut_data);实际上驱动硬件在CAN总线上发送消息。

我电脑上的整个闪烁过程需要61秒,但在另一台电脑上需要92秒。如果我将ctrl更改为常量(即7),则该过程在第二台计算机上也需要大约61秒。

此外,大多数时候调用此函数,唯一的变化是ctrl,所以我虽然是因为更改ctrl禁止编译器优化代码,但这不能解释为什么这个代码在第一台机器上运行得更快。

为什么会发生这种情况?我该如何解决这个问题?

PS:我正在使用vs2010的cpp编译器

int CAN_protocol::CAN_TransferData(U32 CANNo, U8 ctrl, U32 len)
{
    int result;
    CAN_msg msg;
    U16 lenth;

    lenth = (U16)len + 2;
    memset(msg.data, 0xff, 8);
    msg.id= 0x7E0;
    msg.data[0] =(0x10 | (lenth >> 8));
    msg.data[1] = lenth & 0xff;
    msg.data[2] = 0x36;
    msg.data[3] = ctrl; // change ctrl to 0 here will significantly increase execute speed.
    memcpy(&msg.data[4], &cut_data[1], 4);
    msg.len = 8;
    msg.ch = 1;
    msg.format = CAN_ID_FORMAT_STANDARD;
    msg.type = CAN_FRAME_TYPE_DATA;

    result = CAN_messageProc(&msg, cut_data);

    return result;
}

1 个答案:

答案 0 :(得分:-1)

可能是因为msg.data不是U8类型而且正在扩展吗?判断我的假设是否正确的最佳方法是使用ctrl和常量发布生成的程序集。