我一直在徘徊一段时间。我还是初学者,所以我的程序很简单,几乎不需要任何资源。我熟悉C ++,Java和C#。但是在未来,事情会变得更加复杂,有更多的变量和对象以及更多的功能/方法。
为了改变变量的值,我可以调用一次改变值的函数/方法。在那之后,当我需要变量时,我必须简单地调用它。获得价值所需的时间更少。如果该功能做了很多工作,它消耗的时间只会经历一次。但是变量需要内存中的空间,当它们的数量变得很大时,这可能会成为一个问题。
但是我可以调用一个返回我需要的值的函数/方法。我只需要在必要时使用变量,这意味着更少的变量。如果函数/方法很短,这不是问题。但是一些函数/方法在返回值之前必须做很多工作。这样,程序对用户来说似乎会变慢。
我的问题是:使用返回值的函数/方法记忆变量VS中的值:哪个更好,何时以及为什么?
这个问题听起来像:高速和更多消耗的内存VS消耗更少的内存和低速...
答案 0 :(得分:7)
你指出你有时可以用更差的空间效率来提高效率,或者当然,相反。
哪个更好?显然这取决于问题的答案:哪些可用,空间或时间较少?
Bing需要在几分之一秒内搜索整个互联网;对于Bing团队来说,时间非常昂贵并且空间非常便宜,所以他们总是选择寻求节省时间的解决方案,即使这意味着使用额外的空间。
有些人在可以节省时间的问题上工作,但他们无法在机器中放置更多的内存,因为机器就在火星周围的轨道上。这些人倾向于优化空间效率,提高时间效率。
根据您的实际情况,您需要进行权衡。在你考虑实际成本之前,没有一种方法明显优于另一种。
答案 1 :(得分:1)
通常明智的做法是避免缓存可以计算的值,因为这样你就可以避免在不同的地方维持状态(如果你最终忘记的话就打破一致性)。
抽象出一些值的计算(比如隐藏在函数后面)是一个好主意。稍后,一旦您的代码工作并且您觉得它很慢,那么使用分析来确定热点。如果这样的函数变成了一个热点,你可以在下面引入缓存/ memoizing,抽象(在一个理想的世界中)将覆盖客户端(函数)的讨厌细节。
<强>记忆化强>
记忆函数通常涉及查找表(基于数组,关联数组等),其中键类型是memoized函数的参数的聚合,而存储的值是函数的返回值。 / p>
然后,该函数首先检查结果是否已在查找表中可用并返回,或者计算结果并在返回之前存储它。
实际上,如果编程语言支持这种抽象,那么这种memoization可以从memoized函数中分离出来,并作为一个单独的层(包装函数)实现。在没有第一类函数的语言中,通常可以使用接口和单方法类来实现。答案 2 :(得分:1)
使用面向对象编程(因为你有C#,Java和C ++)作为标记时要记住的一件事是类应该具有紧密内聚和松散耦合
在你提出的问题中,你要陈述......
但是有些功能/方法必须先做很多工作才能完成 返回值
一个紧密凝聚的课程将努力实现一个单一的,专注的目的,并且该课程的其他方法将会效仿。
在可维护性和整体良好的面向对象编程方面,使用大型方法进行各种计算以恢复值而不是具有紧密内聚的封装类是不好的做法。
维护一堆大而复杂的方法来返回一个计算值,而不仅仅是在定义良好的方法中使用私有变量,这可能是开发人员最糟糕的噩梦。