什么是Overhead

最近再看Documentation的时候,总是看到它提及Overhead, 例如:

By running “infrequently” there is very little performance overhead; while profiling, your code can run at nearly native speed.

源自v0.6.2的Profile section

请问overhead是什么概念呢?

中文大概是 性能开销/花费

Wikipedia

In computer science, overhead is any combination of excess or indirect computation time, memory, bandwidth, or other resources that are required to perform a specific task. It is a special case of engineering overhead.

youdao

overhead

所以这个地方强调的是非代码本身所引起的开销吗?
比如编译本身的时间相对于执行已经编译过的机器代码就是Overhead?
请问这样的理解正确吗?

编译时间应该不算吧。看 Overhead (computing) - Wikipedia 举的例子可能会容易理解一点

我感觉你引用的那句话的意思是,跑的边数多了 jit 有优化/缓存,然后就能和 native 的代码差不多快
这里的 overhead 应该是指的运行环境的影响

一般来说就是额外的负担,为了达到目的,除了必要的操作之外,还要附加额外的操作。

一些抽样的profiler工作原理大概是每隔一个固定时间(我记得Julia这个默认好像是0.5s)去统计一下有哪些函数被调用了。这个实际上是会一定程度降低你的profile时间的,而这个并不是你代码本身真实的速度慢了,但这并不影响你去分析代码运行时间,因为按照比例的统计信息是有的。

overhead是计算机领域经常提及的概念,一般意义上有这个意思:
比如你要煎鸡蛋 一个平底锅同时只能煎一个鸡蛋
煎蛋的过程是首先放油 热锅 然后放鸡蛋 煎一段时间 起锅 洗锅
第一天早上 你给自己煎一个鸡蛋 需要的工作量是A
第二天 你给全家煎三个鸡蛋 需要的工作量是B
但是煎三个鸡蛋的工作量B不等于3 * A
这是因为无论你煎多少个鸡蛋,都只需要热一次锅 煎完之后洗一次锅
这些时间开销就叫overhead
叫做“额外开销”是因为,这些步骤对于你要完成的事(将蛋变成煎蛋)没有直接贡献,对于煎鸡蛋来说,真正的工作时间是鸡蛋在适宜的高温下变熟的这段时间,煎多少个蛋就会花多少倍这些时间,而热锅和洗锅相对无关。

如果你总是只煎一个鸡蛋,overhead就会占用你许多时间
如果你是卖煎蛋的 每天连续煎几百个蛋 overhead占的时间就很少

可以看看这个高赞回答:
stackoverflow.com: what is overhead?

有的时候,也使用overhead这一词简单表示性能的折损
比如你写了两个程序A和B 都做同一件事,但是A比B慢20%或者多花20%内存 然后就可以说A相比B有20%的performance overhead,或者A的空间占用有20%的overhead,表示A实现的没有那么好。

3 个赞

了解.
如果总的时间复杂度是比如是O(n+c),那么const的部分就是Overhead对吧.

对,差不多是这样。