【问题标题】:What is "overhead"? [closed]什么是“开销”? [关闭]
【发布时间】:2011-04-26 16:13:13
【问题描述】:

什么是开销?是否有多种类型的开销,还是只有一种?有哪些例子?

【问题讨论】:

标签: overhead


【解决方案1】:

overheadcost 的商业含义最能说明问题。来自维基百科:

术语开销通常用于 团体费用是必要的 的持续运作 业务,但不能立即 与产品/服务相关的 正在提供1(例如不要直接 产生利润)。

开销是您执行一项操作所产生的“成本”;您需要“投入”一些资源来执行相关操作。

【讨论】:

    【解决方案2】:

    开销是对特定资源的任何使用,它是您实际尝试实现的副作用。例如结构填充是内存开销的一种形式。在堆栈上推送和弹出参数是一种处理开销。包头是带宽开销的一种形式。想想一个资源,它可能有与之相关的开销。

    【讨论】:

    • 我不会说“不受欢迎”,而更像是“副作用”。
    • @tenfour:是的,这样好多了。我已将其纳入我的答案中。
    【解决方案3】:

    以下是结构和类的大小开销示例:

    struct first {
        char letter1;
        int number;
        char letter2;
    };
    
    struct second {
        int number;
        char letter1;
        char letter2;
    };
    
    int main ()
    {
        cout << "Size of first: " << sizeof(first) << endl;
        cout << "Size of second: " << sizeof(second) << endl;
        return 0;
    }
    

    结果是:

    Size of first: 12
    Size of second: 8
    

    编译器必须构建一个字对齐的结构。在第一个结构中,周围的 char(每个一个字节)导致编译器“下推”int,以便它可以作为一个完整的字(四个字节)访问。第二个结构几乎不需要太多的推动。

    故事的寓意:将大小相似的数据成员并排放置。

    【讨论】:

      【解决方案4】:

      这是一个时间开销示例,与更好地利用局部性来利用缓存有关:

      #include <stdio.h>
      
      #define SIZE 1024
      
      double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];
      
      int main ()
      {
          int i, j, k;
      
          for (i = 0; i < SIZE; i++) {
              for (j = 0; j < SIZE; j++) {
                  for (k = 0; k < SIZE; k++) {
                      C[i][j] += A[i][k] * B[k][j];
                  }
              }
          }
      
          return 0;
      }
      

      在我的机器上运行它需要这么多时间:

      real    0m35.137s
      user    0m34.996s
      sys     0m0.067s
      

      现在我将交换 j 和 k 循环迭代:

      #include <stdio.h>
      
      #define SIZE 1024
      
      double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];
      
      int main ()
      {
          int i, j, k;
      
          for (i = 0; i < SIZE; i++) {
              for (k = 0; k < SIZE; k++) {            // this is the only change
                  for (j = 0; j < SIZE; j++) {
                      C[i][j] += A[i][k] * B[k][j];
                  }
              }
         }
      
         return 0;
      }
      

      这个的运行时间是:

      real    0m5.489s
      user    0m5.436s
      sys     0m0.040s
      

      它更快,因为循环迭代更符合数组索引的顺序。因此,数据更有可能被连续访问,因此更有可能在缓存中可用。

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 1970-01-01
        • 2019-01-09
        • 2013-08-13
        • 1970-01-01
        • 2012-06-21
        • 2011-05-28
        • 2016-09-02
        • 2018-07-12
        相关资源
        最近更新 更多