内存和性能之间的权衡

Posted

技术标签:

【中文标题】内存和性能之间的权衡【英文标题】:a trade-off between memory and performance 【发布时间】:2013-05-25 18:45:05 【问题描述】:

这个问题是关于。

我在 Linux 上做 C++。

for_loop() 是时间关键路径。我正在尝试尽可能减少它的运行时间。

myArray.assignMemory(); // the memory will be 50KB.
if (myFlag)
   myArray is assigned meaningful values
else
   myArray is assigned NotNumber (a very small negative number)

for_loop ( iterationNumber = N)   // N will be very large
   myF1 ( myArray[i] ) ;  


myF1(double j)
  if(myFlag)
    use j
 else
   doNothing

在这里,即使 myFlag 为 false,也将内存分配给 myArray,在这种情况下,内存被浪费了。但是,如果我将 if(myFlag) 放在 for_loop 中,则会产生性能开销。

我可以将 if(myFlag) 放在 for_loop 之外,这样如果 myFlag 为真,我们运行 myF1(myArray[i]),否则,我们运行 myF1(notNumber)。但是,这会有重复。

所以,我的问题是:还有其他更好的方法可以在不浪费任何内存的同时不增加性能开销吗?

谢谢

【问题讨论】:

首先,您可以将myF1 标记为inline,并希望编译器优化调用。或者可能使用几个线程,并在线程之间划分数据集。 根据上面的代码if (!myFlag)不需要进一步处理,因为myF1在这种情况下总是什么都不做,对吗? 如何从分析器开始找出瓶颈的确切位置? 通过分析器运行代码。除非你这样做了,否则你就是在浪费时间。 【参考方案1】:

对我来说,就我所见:

myArray.assignMemory(); // the memory will be 50KB.
if (myFlag)
   myArray is assigned meaningful values
else
   myArray is assigned NotNumber (a very small negative number)

for_loop ( iterationNumber = N)   // N will be very large
   myF1 ( myArray[i] ) ;  


myF1(double j)
  if(myFlag)
    use j
 else
   doNothing

一样
if (myflag)

  myArray.assignMemory(); // the memory will be 50KB.
   myArray is assigned meaningful values

  for_loop ( iterationNumber = N)   // N will be very large
     myF1 ( myArray[i] ) ;  
  


myF1(double j)
    use j

当然,可能是您的代码做的事情比您描述的要多,在这种情况下,这部分答案完全没用(但不是我的错 - 我只能按照您发布的内容进行,并且发布的代码不会对 myArray 做任何其他事情。

至于您的直接问题,这实际上取决于您要达到的目标。 50KB 并不是一个很大的分配(只要你不做几次)。但是分配你实际上并不需要的内存也是完全没有意义的,而且需要时间。

您的问题的标题是关于“内存和性能之间的权衡”,通常是关于“我是在大量内存中存储一​​些可以快速访问的东西,还是找出一种内存效率更高的存储方式,但是需要更多时间。”例如,如果我们有一个电话簿,我们可以有一个非常大的数组,其中包含从 000000000 到 999999999 的所有电话号码在一个大的、直接寻址的数组中,或者我们可以使用仅存储项目的 maphash_map我们实际上需要在表中。直接寻址的数组访问起来更快,但它太大了以至于它可能不适合大多数机器的内存[如果每条记录也很大的话]。所以这是一个选择,我们是让它“快速,使用大量内存”,还是我们让它“小内存,但不是那么快”。和很多事情一样,没有直接的正确或错误答案 - 这取决于速度或内存空间哪个更重要。

【讨论】:

【参考方案2】:

在检查 MyFlag 之后、for_loop() 之前调用 myArray.assignMemory()。根据myArray is assigned meaningful valuesmyArray is assigned NotNumber (a very small negative number) 所做的事情,您可能需要更改myArray 所属类的实现。

【讨论】:

myArray 类不允许更改。 让我重新表述一下:根据myArray is assigned meaningful valuesmyArray is assigned NotNumber (a very small negative number) 所做的事情,您甚至可能不需要更改myArray 所属类的实现。 "myArray 被分配了有意义的值" 确实为 myArray 分配了一个有用的双精度数。你能告诉我为什么你的解决方案可以解决问题吗?谢谢!

以上是关于内存和性能之间的权衡的主要内容,如果未能解决你的问题,请参考以下文章

当数据量较小时,内存到内存 DMA 传输是不是存在权衡?

如何合理的使用Redis内存

效率与内存的权衡[关闭]

IPC共享内存和线程内存的性能差异

重新安装与设置显示之间的性能和内存差异=“无”

ios 常见性能优化