记忆和表现之间的权衡

时间:2013-05-25 18:45:05

标签: c++ linux performance memory for-loop

这个问题是关于记忆和表现之间的权衡。

我在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为true,我们运行myF1(myArray [i]),否则,我们运行myF1(notNumber)。但是,这将有重复。

所以,我的问题是:是否有其他更好的方法不会浪费性能开销而不浪费任何内存?

由于

2 个答案:

答案 0 :(得分: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做任何其他事情。

关于你的DIRECT问题,这实际上取决于你想要达到的目标。 50KB不是一个非常大的分配(只要你没有多次这样做)。但是,分配你实际上并不需要的内存也是完全没有意义的,需要时间。

你的问题的标题是关于“内存和性能之间的权衡”,这通常是关于“我是否可以将内容存储在快速访问的大量内存中,或者以更节省内存的方式存储它,但是花更多的时间。“例如,如果我们有一个电话簿,我们可以在一个直接寻址的大型阵列中有一个非常大的阵列,所有电话号码都在000000000到999999999之间,或者我们可以使用maphash_map只存储我们在表格中实际需要的项目。直接寻址的数组访问速度更快,但它更大,以至于它可能不适合大多数机器的内存[如果每个记录也很大]。所以这是一个选择,我们是否“快速,使用大量内存”,或者我们将其设为“小内存,但不是那么快”。就像很多东西一样,没有直接的正确或错误的答案 - 这取决于哪个更重要,速度或内存空间。

答案 1 :(得分:0)

在检查MyFlag之后,但在myArray.assignMemory()之前调用for_loop()。根据{{​​1}}和myArray is assigned meaningful values的作用,您可能需要更改myArray is assigned NotNumber (a very small negative number)所属的类的实现。