我正在努力提高我的程序的性能(在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()
表现得更好?为什么呢?
很少有事情可以考虑..
我想澄清一下,我的问题更多是关于 WHICH 方法更优化,更少关于如何使此代码更优化。这段代码只是一个例子。
关于使上述代码更加优化,@ Snkin已给出了正确答案。
答案 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是一种用于设置内存的通用方法,可能在其中有额外的逻辑来处理边缘条件,例如未对齐的内存。编译器可以比通用算法更智能地实现初始化器(至少,人们希望如此)。