Union与void pointer性能对比:Union是否具备性能优势?
Union 是否在性能上优于 void 指针?
我在搜索“Union vs void pointer performance”时,浏览了Stack Overflow上的《Union versus void pointer》问题,许多人建议使用Union,但均未提及性能原因。我的疑问是:由于需要反复进行类型转换,void pointer是否比Union耗时更长?
我编写了以下代码进行性能测试,发现Union的性能表现更优。
#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> typedef struct union_test union_test; typedef struct void_test void_test; typedef void (*PrintUnionFunction)(union_test *); typedef void (*PrintVoidFunction)(void_test *); typedef enum ELEM_TYPE { INT_TYPE, STRING_TYPE, FLOAT_TYPE } ELEM_TYPE; struct union_test { ELEM_TYPE elemType; union { int **intElems; float **floatElems; char **stringElems; }; size_t elemCount; PrintUnionFunction printFunction; }; struct void_test { ELEM_TYPE elemType; void **elems; size_t elemCount; PrintVoidFunction printFunction; }; void printUnionInt(union_test *fpTest) { for (size_t i = 0; i < fpTest->elemCount; i++) { int *temp = fpTest->intElems[i]; (*temp)++; // printf("%d ", *fpTest->intElems[i]); } } void printVoidPointerInt(void_test *fpTest) { for (size_t i = 0; i < fpTest->elemCount; i++) { int *temp = ((int *)fpTest->elems[i]); (*temp)++; // printf("%d ", *fpTest->intElems[i]); } } int main() { clock_t start_time_union, end_time_union; clock_t start_time_void, end_time_void; size_t elemCount = 1024 * 1024 * 1024; union_test *fp = (union_test *)malloc(sizeof(union_test)); fp->elemCount = elemCount; fp->elemType = INT_TYPE; fp->printFunction = printUnionInt; fp->intElems = (int **)malloc(sizeof(int *) * fp->elemCount); for (size_t i = 0; i < fp->elemCount; i++) { fp->intElems[i] = (int *)malloc(sizeof(int)); memcpy(fp->intElems[i], &i, sizeof(int)); } void_test *void_fp = (void_test *)malloc(sizeof(union_test)); void_fp->elemCount = elemCount; void_fp->elemType = INT_TYPE; void_fp->printFunction = printVoidPointerInt; void_fp->elems = (void **)malloc(sizeof(void *) * void_fp->elemCount); for (size_t i = 0; i < void_fp->elemCount; i++) { void_fp->elems[i] = (int *)malloc(sizeof(int)); memcpy(void_fp->elems[i], &i, sizeof(int)); } start_time_union = clock(); fp->printFunction(fp); end_time_union = clock(); start_time_void = clock(); void_fp->printFunction(void_fp); end_time_void = clock(); printf("\nunion execution time: %f seconds\n", (double)(end_time_union - start_time_union) / CLOCKS_PER_SEC); printf("void pointer execution time: %f seconds\n", (double)(end_time_void - start_time_void) / CLOCKS_PER_SEC); return 0; }
测试结果如下:
union execution time: 8.237730 seconds void pointer execution time: 8.647505 seconds
我曾看到资料称使用-O3优化会让编译器忽略指针类型,仅将其视为内存字节,但即使开启-O3标志,我也未发现性能有所提升。
注:我仅关注性能而非可读性。我知道在处理有限类型时,使用Union有助于提升可读性。
内容的提问来源于stack exchange,提问作者widesense
相关产品推荐
相关产品推荐

