为什么在函数内使用静态变量会使函数运行更慢?

时间:2019-01-20 21:48:41

标签: c++

我在开始时就创建了一个带有静态启动的函数,以便仅在第一次调用该函数时才计算值,但随后该函数运行速度会变慢。

在Windows10(I5处理器3.5Ghz)上使用VS2017

这是结果:

image

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;
}

1 个答案:

答案 0 :(得分:6)

因为编译器必须确保即使在多线程环境中,静态局部变量初始化也只能执行一次。

因此,局部静态变量初始化被昂贵的线程安全防护所包围。这就是为什么不建议使用静态局部变量的原因。