什么是“开销”?

我是一名计算机科学专业的学生,​​在程序和sorting方面我听到很多“开销”这个词。 这是什么意思?

这是build立操作所需的资源。 这似乎没有关系,但是必要的。

就像你需要去某个地方的时候,你可能需要一辆车。 但是,开一辆车在街上开车会花费很多,所以你可能要走路。 但是,如果你正在全国各地,这个开销是值得的。

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

这个词的含义可以与上下文有很大的不同。 一般来说,它是使用的资源(通常是内存和CPU时间),这些资源不直接影响预期的结果,而是正在使用的技术或方法所要求的。 例子:

  • 协议开销 :以太网帧,IP数据包和TCP段都有标题,TCP连接需要握手数据包。 因此,您无法使用硬件能够用于实际数据的整个带宽。 您可以通过使用较大的数据包大小来减less开销,并且UDP具有较小的头部和无握手。
  • 数据结构内存开销 :链表对于每个包含的元素至less需要一个指针。 如果元素与指针的大小相同,则意味着50%的内存开销,而数组可能具有0%的开销。
  • 方法调用开销 :精心devise的程序被分解成许多简短的方法。 但每个方法调用都需要设置一个堆栈帧,复制参数和返回地址。 与一个单一function的程序相比,这代表了CPU开销。 当然,增加的可维护性使其非常值得,但在某些情况下,过多的方法调用会对性能产生重大影响。

维基百科涵盖了我们 :

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

开销通常会受到不同编程algorithm所花费的额外资源(内存,处理器,时间等)的影响。

例如,插入到一个平衡的二元树中的开销可能比插入到一个简单的链接列表中的开销要大得多(插入将花费更长的时间,使用更多的处理能力来平衡树,从而导致更长的操作时间用户)。

你累了,不能做更多的工作。 你吃的食物。 花在寻找食物上的能量,得到它并且真正地吃它消耗能量,并且在头顶上!

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

在计算机科学可以说你想打印一个数字,这是你的任务。 但是存储号码,设置显示器打印和调用例程来打印它,然后从variables访问数字都是开销。

对于程序员而言,开销指的是在给定的input数据集上运行在给定平台上时,代码所使用的那些系统资源。 通常这个术语用在比较不同的实现或可能的实现的上下文中。

例如,我们可能会说一个特定的方法可能会导致相当大的CPU开销,而另一个可能会导致更多的内存开销,另一个可能会加重networking开销(并且需要外部依赖)。

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

显而易见的方法是循环input,保持运行总数和计数。 当遇到最后一个数字时(通过“文件结束”EOF,或者一些标记值,或者一些GUIbutton,不pipe怎么说),然后我们简单地把总数除以input的数量,就完成了。

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

另一种可能的方法是“input”到列表中。 迭代列表以计算总和,然后除以列表中有效项目的数量。

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

在一个特别糟糕的实现中,我们可能使用recursion进行求和操作,但是没有尾部消除。 现在,除了我们列表的内存开销之外,我们还引入了堆栈开销(这是一种不同的内存,通常是比其他forms的内存更有限的资源)。

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

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

我们也可以谈论由程序员自己的代码之外的因素引起的开销。 例如,编译32位或64位处理器的某些代码可能需要比旧的8位或16位体系结构更高的开销。 这可能涉及更大的内存开销(alignment问题)或CPU开销(CPU被迫调整位sorting或使用非alignment指令等)或两者。

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

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

你可以查看维基百科 。 但主要是在使用更多的行动或资源时。 就像如果你熟悉.NET一样,你可以有值types和引用types。 引用types具有内存开销,因为它们需要比值types更多的内存。

开销的具体示例是“本地”过程调用和“远程”过程调用之间的区别。

例如,对于经典的RPC(以及许多其他远程框架,如EJB),函数或方法调用对于编码器来说看起来是相同的,不pipe是本地调用还是内存调用,或分布式networking调用。

例如:

 service.function(param1, param2); 

这是一个正常的方法,或远程方法? 从你在这里看到的,你不能告诉。

但是你可以想象,这两个电话之间的执行时间差异是很大的。

所以,虽然核心实施将“成本相同”,但涉及的“开销”却是截然不同的。

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

Interesting Posts