这个问题是关于记忆和表现之间的权衡。
我在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)。但是,这将有重复。
所以,我的问题是:是否有其他更好的方法不会浪费性能开销而不浪费任何内存?
由于
答案 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之间,或者我们可以使用map
或hash_map
只存储我们在表格中实际需要的项目。直接寻址的数组访问速度更快,但它更大,以至于它可能不适合大多数机器的内存[如果每个记录也很大]。所以这是一个选择,我们是否“快速,使用大量内存”,或者我们将其设为“小内存,但不是那么快”。就像很多东西一样,没有直接的正确或错误的答案 - 这取决于哪个更重要,速度或内存空间。
答案 1 :(得分:0)
在检查MyFlag之后,但在myArray.assignMemory()
之前调用for_loop()
。根据{{1}}和myArray is assigned meaningful values
的作用,您可能需要更改myArray is assigned NotNumber (a very small negative number)
所属的类的实现。