c++ - 为什么在函数内部使用静态变量会使它运行得更慢?

标签 c++

为了只在函数第一次调用时才计算值,我在一开始做了一个静态启动的函数,但后来函数运行速度变慢了。

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

结果如下:

image

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/

相关文章:

c++ - 在模板结构的所有实例中将成员设置为相同的值

c++ - 为什么我将两个短整数相乘得到一个负数?

c# - 如何从服务器中的客户端池中识别客户端 - 设计

c# - 防止 GC 在 C# 中获取我的委托(delegate)

c++ - "LRESULT CALLBACK WinProc"和 "LRESULT WINAPI WinProc"之间的区别

c++ - QDir currentPath 和 cd() 不工作?

c++ - 使用 std::conditional_variable 等待条件

c++ - 在 64 位 Ubuntu 14.04 上为 32 位应用程序构建 QT (QJSValue : No such file or directory)

c++ - 打印系统时间后防止换行

c++ - 构造函数主体前的冒号是否表示继承