只是想知道这种代码建议提高性能吗?
void functionCalledLotsofTimes() {
static int *localarray = NULL;
//size is a large constant > 10 000
if (localarray == NULL) localarray = new int[size];
//Algorithm goes here
}
我也很好奇现代c ++编译器如g ++如何实现静态变量。它们是否像全局变量一样处理?
答案 0 :(得分:12)
不推荐使用,因为您正在向函数引入全局状态。当您在函数中具有全局状态时,您会产生副作用。副作用会导致问题,特别是在多线程程序中。
有关详细信息,请参阅Referential Transparency。使用相同的输入,无论您使用多少线程,您始终都希望拥有相同的输出。
如果要提高效率,请允许用户将缓冲区本身指定为其中一个参数。
查看global and static variables here之间的区别。
答案 1 :(得分:0)
性能有很大提高,但您必须非常小心如何使用数据。如果是多线程,则必须为数据提供访问控制
做这个测试:
#include <windows.h> #include <stdio.h> void StartTime ( LARGE_INTEGER * pTime ) { QueryPerformanceCounter ( pTime ); } ULONG EndTime( LARGE_INTEGER * pTime ) { LARGE_INTEGER liDiff; LARGE_INTEGER liFreq; QueryPerformanceCounter(&liDiff); liDiff.QuadPart -= pTime->QuadPart; liDiff.QuadPart *= 1000; // Adjust to milliseconds, shouldn't overflow... (void)QueryPerformanceFrequency(&liFreq); return ((ULONG)(liDiff.QuadPart / liFreq.QuadPart)); } void functionCalledLotsofTimesStatic(int size) { static int *localarray = NULL; //size is a large constant > 10 000 if (localarray == NULL) localarray = new int[size]; //Algorithm goes here } void functionCalledLotsofTimesDynamic(int size) { int *localarray = NULL; //size is a large constant > 10 000 if (localarray == NULL) localarray = new int[size]; //Algorithm goes here delete [] localarray; } int _tmain(int argc, _TCHAR* argv[]) { LARGE_INTEGER liTimeDynamic, liTimeStatic; StartTime ( & liTimeDynamic ); for (int loop = 0; loop < 100000 ; loop++ ) { functionCalledLotsofTimesDynamic ( 10000 ); } printf ( "Time dynamic alocation : %lu milliseconds\n", EndTime(&liTimeDynamic)); StartTime ( & liTimeStatic ); for (int loop = 0; loop < 100000 ; loop++ ) { functionCalledLotsofTimesStatic ( 10000 ); } printf ( "Time staic alocation : %lu milliseconds\n", EndTime(&liTimeStatic)); return 0; }
答案 2 :(得分:0)
如果我没有弄错,那么看看静态变量是否已经初始化的测试无论如何都是由“系统”完成的。不需要自己动手。只需写下
static int *localarray = new int[size];
只有第一次调用该函数时,才会创建数组。
答案 3 :(得分:0)
通常这种代码隐藏在具有大量预分配缓冲区的自定义分配器类后面,因此“动态分配”实际上不是。
std :: vector的许多实现都有一个更基本的实现形式:默认情况下,它以2的幂分配“块”内存,因此在向量增长之前不需要进行真正的新分配到两倍大小。