179

我是计算机科学专业的学生,​​在谈到程序和排序时,我经常听到“开销”这个词。这到底是什么意思?

4

12 回答 12

230

这是设置操作所需的资源。这似乎无关紧要,但却是必要的。

就像当你需要去某个地方时,你可能需要一辆车。但是,让汽车在街上行驶会产生很多开销,所以您可能想步行。但是,如果您要穿越全国,开销将是值得的。

在计算机科学中,有时我们会使用汽车在街上走,因为我们没有更好的方法,或者不值得我们花时间“学习如何走路”。

于 2010-05-18T19:06:45.927 回答
46

该词的含义可能与上下文有很大不同。通常,使用的是资源(通常是内存和 CPU 时间),它们不会直接影响预期的结果,而是正在使用的技术或方法所需要的。例子:

  • 协议开销:以太网帧、IP 包和 TCP 段都有标头,TCP 连接需要握手包。因此,您无法使用硬件能够为您的实际数据提供的全部带宽。您可以通过使用更大的数据包大小来减少开销,并且 UDP 具有更小的标头并且没有握手。
  • 数据结构内存开销:链表包含的每个元素至少需要一个指针。如果元素与指针大小相同,这意味着 50% 的内存开销,而数组可能有 0% 的开销。
  • 方法调用开销:一个设计良好的程序被分解成许多简短的方法。但是每个方法调用都需要设置堆栈帧、复制参数和返回地址。与在单个单一功能中完成所有操作的程序相比,这表示 CPU 开销。当然,增加的可维护性使其非常值得,但在某些情况下,过多的方法调用可能会对性能产生重大影响。
于 2010-05-18T19:44:17.960 回答
23

你累了,不能再做任何工作了。你吃食物。寻找食物、获取食物和实际食用食物所消耗的能量会消耗能量并且是开销!

开销是为了完成任务而浪费的东西。目标是使开销非常非常小。

在计算机科学中,假设您想打印一个数字,那是您的任务。但是存储数字,设置显示以打印它并调用例程来打印它,然后从变量中访问数字都是开销。

于 2010-05-18T19:44:25.403 回答
16

维基百科涵盖了我们

在计算机科学中,开销通常被认为是多余或间接计算时间、内存、带宽或实现特定目标所需的其他资源的任何组合。这是工程开销的一个特例。

于 2010-05-18T19:06:40.613 回答
13

开销通常是指不同编程算法占用的额外资源(内存、处理器、时间等)的数量。

例如,插入平衡二叉树的开销可能比插入简单链表的开销大得多(插入将花费更长的时间,使用更多的处理能力来平衡树,这会导致更长的感知操作时间用户)。

于 2010-05-18T19:06:03.630 回答
6

对于程序员来说,开销是指代码在给定平台上的给定输入数据集上运行时消耗的那些系统资源。通常,该术语用于比较不同实现或可能实现的上下文中。

例如,我们可能会说一种特定的方法可能会产生相当大的 CPU 开销,而另一种可能会产生更多的内存开销,而另一种可能会加重网络开销(例如,需要外部依赖)。

让我们举一个具体的例子:计算一组数字的平均值(算术平均值)。

显而易见的方法是循环输入,保持运行总数和计数。当遇到最后一个数字时(由“文件结尾”EOF、某个标记值或某个 GUI 按钮等发出信号),我们只需将总数除以输入数即可。

这种方法在 CPU、内存或其他资源方面几乎没有开销。(这是一项微不足道的任务)。

另一种可能的方法是将输入“啜饮”到一个列表中。遍历列表以计算总和,然后将其除以列表中有效项目的数量。

相比之下,这种方法可能会产生任意数量的内存开销。

在一个特别糟糕的实现中,我们可能会使用递归而不是尾部消除来执行求和运算。现在,除了列表的内存开销外,我们还引入了堆栈开销(这是一种不同类型的内存,通常是比其他形式的内存更有限的资源)。

另一种(可以说更荒谬)的方法是将所有输入发布到 RDBMS 中的某个 SQL 表中。然后只需对该表的该列调用 SQL SUM 函数。这会将我们的本地内存开销转移到其他一些服务器上,并导致网络开销和对我们执行的外部依赖。(请注意,远程服务器可能有也可能没有与此任务相关的任何特定内存开销 --- 例如,它可能会将所有值立即推送到存储中)。

假设可能会考虑在某种集群上实现(可能使数万亿值的平均值变得可行)。在这种情况下,任何必要的值编码和分配(将它们映射到节点)以及结果的收集/整理(减少)都将计为开销。

我们还可以讨论程序员自己代​​码之外的因素所产生的开销。例如,为 32 位或 64 位处理器编译某些代码可能需要比旧的 8 位或 16 位架构更大的开销。这可能涉及更大的内存开销(对齐问题)或 CPU 开销(CPU 被迫调整位顺序或使用非对齐指令等)或两者兼而有之。

请注意,您的代码及其库等占用的磁盘空间通常不称为“开销”,而是称为“占用空间”。此外,您的程序消耗的基本内存(不考虑它正在处理的任何数据集)也称为它的“足迹”。

于 2010-05-18T19:22:18.147 回答
5

开销只是程序执行中消耗的时间越多。例子 ; 当我们调用一个函数并且它的控制被传递到它定义的地方然后它的主体被执行时,这意味着我们让我们的 CPU 运行一个很长的过程(首先将控制传递到内存中的其他地方然后在那里执行然后将控制权传递回以前的位置),因此需要大量的性能时间,因此会产生开销。我们的目标是通过在函数定义和调用期间使用内联来减少这种开销,它在函数调用时复制函数的内容,因此我们不会将控制权传递到其他位置,而是继续我们的程序一行,因此是内联的.

于 2019-04-04T04:30:31.217 回答
2

你可以用字典。定义是一样的。但是为了节省您的时间,开销是完成生产性工作所需的工作。例如,一个算法运行并做有用的工作,但需要内存来完成它的工作。这种内存分配需要时间,并且与正在完成的工作没有直接关系,因此是开销。

于 2010-05-18T19:06:25.793 回答
1

A concrete example of overhead is the difference between a "local" procedure call and a "remote" procedure call.

For example, with classic RPC (and many other remote frameworks, like EJB), a function or method call looks the same to a coder whether its a local, in memory call, or a distributed, network call.

For example:

service.function(param1, param2);

Is that a normal method, or a remote method? From what you see here you can't tell.

But you can imagine that the difference in execution times between the two calls are dramatic.

So, while the core implementation will "cost the same", the "overhead" involved is quite different.

于 2010-05-18T19:59:41.050 回答
1

您可以查看维基百科。但主要是在使用更多操作或资源时。就像您熟悉 .NET 一样,您可以拥有值类型和引用类型。引用类型具有内存开销,因为它们比值类型需要更多的内存。

于 2010-05-18T19:09:17.850 回答
1

将开销视为管理线程并在它们之间进行协调所需的时间。如果线程没有足够的任务去做,这是一个负担。在这种情况下,开销成本超过了通过使用线程节省的时间,并且代码比顺序代码花费更多时间。

于 2015-01-31T20:47:51.407 回答
-4

它除了数据本身之外的任何东西,即 tcp 标志、标头、crc、fcs 等。

于 2018-07-11T11:03:14.720 回答