结构初始化性能

时间:2013-10-01 15:19:10

标签: c linux performance

我正在努力提高我的程序的性能(在ARC平台上运行,使用arc-gcc编译。话虽如此,我不期待特定于平台的答案)。

我想知道以下哪种方法更优,以及为什么。

typedef struct _MY_STRUCT
{
    int my_height;
    int my_weight;
    char my_data_buffer[1024];
}MY_STRUCT;

int some_function(MY_STRUCT *px_my_struct)
{
    /*Many operations with the structure members done here*/
    return 0;
}

void poorly_performing_function_method_1()
{
    while(1)
    {
        MY_STRUCT x_struct_instance = {0}; /*x_struct_instance is automatic variable under WHILE LOOP SCOPE*/
        x_struct_instance.my_height = rand();
        x_struct_instance.my_weight = rand();
        if(x_struct_instance.my_weight > 100)
        {
            memcpy(&(x_struct_instance.my_data_buffer),"this is just an example string, there could be some binary data here.",sizeof(x_struct_instance.my_data_buffer));
        }
        some_function(&x_struct_instance);

        /******************************************************/
        /* No need for memset as it is initialized before use.*/
        /* memset(&x_struct_instance,0,sizeof(x_struct_instance));*/
        /******************************************************/
    }
}

void poorly_performing_function_method_2()
{
    MY_STRUCT x_struct_instance = {0}; /*x_struct_instance is automatic variable under FUNCTION SCOPE*/
    while(1)
    {
        x_struct_instance.my_height = rand();
        x_struct_instance.my_weight = rand();
        if(x_struct_instance.my_weight > 100)
        {
            memcpy(&(x_struct_instance.my_data_buffer),"this is just an example string, there could be some binary data here.",sizeof(x_struct_instance.my_data_buffer));
        }
        some_function(&x_struct_instance);
        memset(&x_struct_instance,0,sizeof(x_struct_instance));
    }
}

在上面的代码中,poorly_performing_function_method_1()会表现得更好还是会poorly_performing_function_method_2()表现得更好?为什么呢?

很少有事情可以考虑..

  • 在方法#1中,可以解除分配,重新分配结构内存会增加更多开销吗?
  • 在方法#1中,在初始化期间,是否有任何优化发生?像calloc乐观的内存分配和零填充页面中的内存分配)?

我想澄清一下,我的问题更多是关于 WHICH 方法更优化,更少关于如何使此代码更优化。这段代码只是一个例子。

关于使上述代码更加优化,@ Snkin已给出了正确答案。

1 个答案:

答案 0 :(得分:3)

一般来说,不做某事比做某事要快。

在您的代码中,您正在清除结构,然后使用数据初始化它。你正在做两次内存写入,第二次只是覆盖第一次。

试试这个: -

void function_to_try()
{
  MY_STRUCT x_struct_instance;
  while(1)
  {
    x_struct_instance.my_height = rand();
    x_struct_instance.my_weight = rand();
    x_struct_instance.my_name[0]='\0';
    if(x_struct_instance.my_weight > 100)
    {
        strlcpy(&(x_struct_instance.my_name),"Fatty",sizeof(x_struct_instance.my_name));
    }
    some_function(&x_struct_instance);
  }
}

<强>更新

为了回答更优化的问题,我建议方法#1,但它可能是边缘的,并且取决于编译器和其他因素。我的理由是没有任何分配/释放,数据在堆栈上,编译器创建的函数前导码将为函数分配足够大的堆栈帧,使得它不需要调整大小。在任何情况下,在堆栈上分配只是移动堆栈指针,因此它不是一个很大的开销。

另外,memset是一种用于设置内存的通用方法,可能在其中有额外的逻辑来处理边缘条件,例如未对齐的内存。编译器可以比通用算法更智能地实现初始化器(至少,人们希望如此)。