我是计算机科学专业的学生,在程序和排序方面,我经常听到“开销”一词。这到底是什么意思?
我是计算机科学专业的学生,在程序和排序方面,我经常听到“开销”一词。这到底是什么意思?
Answers:
这是设置操作所需的资源。它看起来似乎无关,但有必要。
就像当您需要去某个地方时,您可能需要汽车。但是,要开车沿着街道行驶,将会有很多开销,因此您可能要走路。但是,如果您要在全国范围内旅行,这笔开销是值得的。
在计算机科学中,有时我们会因为没有更好的方法而开车上街,或者“学习如何走路”不值得我们花时间。
这个词的含义可能因上下文而有很大差异。通常,使用的是资源(通常是内存和CPU时间),它们不会直接对预期结果产生影响,但是所使用的技术或方法需要这些资源。例子:
malloc
由于分配器(假定为经典的32位计算机)由块的大小加上保护值组成,因此返回的每个值都有8个字节的内置开销。而这甚至还没有考虑分配粒度。因此,单链接的简单4字节整数列表将产生75%的开销。数组要好得多(除非您需要在中间快速插入),因为它们可以有一次开销(如果数组不是动态分配的,则开销更少)。
维基百科覆盖了我们:
在计算机科学中,开销通常被认为是达到特定目标所需的多余或间接的计算时间,内存,带宽或其他资源的任意组合。这是工程间接费用的特例。
开销通常涉及不同编程算法占用的额外资源(内存,处理器,时间等)数量。
例如,插入到平衡二叉树中的开销可能比同一插入简单链表中的开销大得多(插入将花费更长的时间,使用更多的处理能力来平衡树,这导致更长的操作时间用户)。
对于程序员而言,开销是指代码在给定平台上的给定输入数据集上运行时,代码所消耗的那些系统资源。通常,该术语用于比较不同的实现或可能的实现的上下文中。
例如,我们可能会说,一种特定的方法可能会导致相当大的CPU开销,而另一种可能会导致更多的内存开销,而另一种可能会加权网络开销(例如,需要外部依赖)。
让我们举一个具体的例子:计算一组数字的平均值(算术平均值)。
显而易见的方法是循环输入,保持运行总计和计数。当遇到最后一个数字时(通过“文件末尾” EOF发出信号,或者通过某些哨兵值,或者通过某种GUI界面,等等),我们只需将总数除以输入数即可。
这种方法几乎不占用CPU,内存或其他资源的开销。(这是一项琐碎的任务)。
另一种可能的方法是将输入“混入”列表。遍历列表以计算总和,然后将其除以列表中有效项目的数量。
相比之下,这种方法可能会导致任意数量的内存开销。
在一个特别糟糕的实现中,我们可能使用递归执行求和运算,但没有尾消除。现在,除了清单中的内存开销外,我们还引入了堆栈开销(这是一种不同的内存,通常比其他形式的内存更有限的资源)。
另一种(可能更荒谬的)方法是将所有输入发布到RDBMS中的某些SQL表中。然后只需在该表的该列上调用SQL SUM函数。这会将我们的本地内存开销转移到其他服务器上,并导致网络开销和对我们执行的外部依赖性。(请注意,远程服务器可能有也可能没有与此任务相关的任何特定内存开销,例如,它可能会将所有值立即推送到存储中)。
假设地考虑在某种集群上实施(可能使数万亿值的平均值可行)。在这种情况下,值的任何必要编码和分配(将它们映射到节点)以及结果的收集/整理(归约)将被算作开销。
我们还可以讨论程序员自身代码以外的因素所引起的开销。例如,为32或64位处理器编译某些代码可能会比在旧的8位或16位体系结构上看到的开销更大。这可能涉及较大的内存开销(对齐问题)或CPU开销(其中CPU被迫调整位顺序或使用了未对齐的指令等)或两者兼而有之。
请注意,您的代码及其库等占用的磁盘空间通常不称为“开销”,而称为“占用空间”。同样,程序消耗的基本内存(不考虑其正在处理的任何数据集)也称为“内存”。
您可以使用字典。定义是相同的。但是为节省您的时间,开销是完成生产性工作所需的工作。例如,一种算法可以运行并完成有用的工作,但是需要内存来完成其工作。这种内存分配需要时间,并且与完成的工作没有直接关系,因此会产生开销。