1

这个问题是关于内存和性能之间的权衡。

我在 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)。但是,这会有重复。

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

谢谢

4

2 回答 2

2

对我来说,据我所见:

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它只存储我们在表中实际需要的项目。直接寻址的数组访问起来更快,但它太大了以至于它可能不适合大多数机器的内存[如果每条记录也很大的话]。所以这是一个选择,我们是让它“快速,使用大量内存”,还是我们让它“小内存,但不是那么快”。和很多事情一样,没有直接的正确或错误答案 - 这取决于哪个更重要,速度或内存空间。

于 2013-05-25T21:41:13.093 回答
0

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

于 2013-05-25T18:51:03.763 回答