为了只在函数第一次调用时才计算值,我在一开始做了一个静态启动的函数,但后来函数运行速度变慢了。
在windows10上使用VS2017(I5处理器3.5Ghz)
结果如下:
const static double: 20ms static double: 16ms double only: 5.1ms sum only: 5ms
Here is the code. function1
is the slowest one.
#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;
}
最佳答案
因为即使在多线程环境下,编译器也必须保证静态局部变量初始化只执行一次。
因此局部静态变量初始化被昂贵的线程安全保护所包围。这就是为什么不鼓励使用静态局部变量的原因。
关于c++ - 为什么在函数内部使用静态变量会使它运行得更慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281316/