我在开始时就创建了一个带有静态启动的函数,以便仅在第一次调用该函数时才计算值,但随后该函数运行速度会变慢。
在Windows10(I5处理器3.5Ghz)上使用VS2017
这是结果:
const static double: 20ms static double: 16ms double only: 5.1ms sum only: 5ms
这是代码。 function1
是最慢的一个。
#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
//=============== TIMER PART =================
#ifdef __linux__
#include <unistd.h> //usleep()
typedef std::chrono::system_clock t_clock; //try to use high_resolution_clock on new linux x64 computer!
#else
typedef std::chrono::high_resolution_clock t_clock;
#pragma warning(disable:4996)
#endif
std::chrono::time_point<t_clock> start_time, stop_time = start_time; char null_char = '\0';
void timer(const char *title = 0, int data_size = 1) { stop_time = t_clock::now(); double us = (double)chrono::duration_cast<chrono::microseconds>(stop_time - start_time).count(); if (title) printf("%s time = %7lgms = %7lg MOPs\n", title, (double)us*1e-3, (double)data_size / us); start_time = t_clock::now(); }
//=============== TIMER PART =================
double f1(double x)
{
const static double a=100.1,b=3+sqrt(a),c=10+sin(b/45)+cos(b/45+a),d=c+tan(b/105.3);
return x+d;
}
double f2(double x)
{
static double a=100.1,b=3+sqrt(a),c=10+sin(b/45)+cos(b/45+a),d=c+tan(b/105.3);
return x+d;
}
double f3(double x)
{
double a=100.1,b=3+sqrt(a),c=10+sin(b/45)+cos(b/45+a),d=c+tan(b/105.3);
return x+d;
}
double f4(double x)
{
return x+17.33;
}
int main()
{
int i,top=500000;
double sum=0.0;
timer();
for (i=0;i<top;i++)
{
sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);
sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);sum+=f1(i*10.0);
}
timer("const static double",top*10);
for (i=0;i<top;i++)
{
sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);
sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);sum+=f2(i*10.0);
}
timer("static double",top*10);
for (i=0;i<top;i++)
{
sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);
sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);sum+=f3(i*10.0);
}
timer("double",top*10);
for (i=0;i<top;i++)
{
sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);
sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);sum+=f4(i*10.0);
}
timer("sum only",top*10);
cout<<sum<<endl;
cout<<"\n=== FIN ==="<<endl;
getchar();return 1;
}
答案 0 :(得分:6)
因为编译器必须确保即使在多线程环境中,静态局部变量初始化也只能执行一次。
因此,局部静态变量初始化被昂贵的线程安全防护所包围。这就是为什么不建议使用静态局部变量的原因。