c++ - `static`的使用如何影响我的代码速度?

标签 c++ performance static clang benchmarking

我正在在线解决一个练习,有一次我需要从字符串的开头和结尾删除“”。这是我的代码:

void static inline process_value(std::string &value) {
    if (value.back() !='>') {
        value = value.substr(1, value.size()-2);
    }
}

从此基准循环调用:
static void UsingStatic(benchmark::State& state) {
  // Code inside this loop is measured repeatedly
  for (auto _ : state) {
      std::string valor("\"Hola\"");
      process_valueS(valor);
    // Make sure the variable is not optimized away by compiler
    benchmark::DoNotOptimize(valor);
  }
}

只是因为好奇我did a benchmark .
  • 编译器: Clang-9.0
  • 标准: c++20
  • 优化: O3
  • STL: libstdc++(GNU)

  • 当我在那里时,我决定删除 static来自 process_value , 制作 void inline process_value否则是一样的。令我惊讶的是,它变慢了。

    我认为 static 仅意味着该函数仅用于文件。但是here它说“'静态'意味着如果可能的话,编译器应该内联该函数”。但是在那种情况下,当我删除 static 时,我认为结果不应该改变。现在我很困惑,除了将函数分隔为单个 .cpp 之外,static 还能做什么? ,这对性能有什么影响?

    QuickBench 上的拆解显示 NoUsingStatic循环实际上调用 process_value而不是内联它,尽管 inline关键字使编译器这样做是合法的。但是UsingStatic将调用内联到 process_valueS .编译器决策的差异大概解释了性能的差异,但 为什么 clang 选择不内联声明的简单函数 void inline process_value(std::string &value){ ... } ?

    编辑:因为问题被关闭,因为它不够清楚,我删除了与问题无关的部分。但如果我遗漏了一些信息,请在评论中告诉我

    最佳答案

    Clang 使用基于成本的决定是否将内联函数。这个成本受很多东西的影响。受static影响.

    幸运的是,clang 有一个输出,我们可以在其中观察到这一点。看看这个神箭 link :

    void call();
    
    inline void a() {
        call();
    }
    
    static inline void b() {
        call();
    }
    
    void foo() {
        a();
        b();
    }
    

    在这个小例子中,a()b()都是一样的,唯一的异常(exception)是 b()是静态的。

    如果您将鼠标移到电话上 a()b()在 Godbolt 上(在 OptViewer 窗口中),您可以阅读:
    a() :成本=0,阈值=487
    b() :成本=-15000,阈值=487

    (如果成本小于阈值,clang 将内联调用。)

    叮当给了b()成本低得多,因为它是静态的。似乎 clang 只会为静态函数降低 -15000 的成本。如 b()被调用了几次,代价都是b() s 将为零,除了一。

    这是您案例的编号,link :
    process_value(): cost=400, threshold=325 -> 刚好在阈值之上,不会被内联
    process_valueS(): : cost=-14600, threshold=325 -> 可以内联

    所以,显然,static如果只调用一次,可能会产生很多影响。这是有道理的,因为内联静态函数一次不会增加代码大小。

    提示:如果要强制 clang 内联函数,请使用 __attribute__((always_inline))在上面。

    关于c++ - `static`的使用如何影响我的代码速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62005841/

    相关文章:

    c++ - 链表内存读取错误

    javascript - 以编程方式删除缓存文件并为其释放分配的内存

    python - 迭代特定列表的最快方法?

    java - 静态方法导致问题

    c++ - 从父类继承时覆盖变量

    c++ - 两台具有相同 IP 地址的计算机 - 使用套接字的聊天应用程序

    c++ - C++-代码优化

    C# 公共(public)静态方法 - 在用户之间共享信息

    c++ - 如何更改函数中的值或静态 char*? C++

    c++ - 退出应用程序前关闭线程