假设我有一个包含以下值的个人资料页面:姓名,姓氏,用户名,关注者和以下计数。
用户登录我的应用程序后可能会更新它们。所以有一个刷新按钮。当用户单击刷新按钮时,我正在调用Web服务以获取新值。作为回报,我得到5个值。
以下是示例:
假设我已调用Web服务并将返回值解析为response
类。
// Here is first approach.
if (!response.name.equals(name)) {
name = response.name;
}
if (!response.lastname.equals(lastname)) {
lastname = response.lastname;
}
// Here is second.
name = response.name;
lastname = response.lastname;
在第一种方法中,我认为if
条件是必需的,因为如果它们的值相同,我将不会浪费分配操作的时间。而且我们也知道if
条件是计算机最快的操作。
在第二种方法中,我认为不需要if
条件,因为我已经在if
条件(name
和response.name
)中访问了这两个值,而不是浪费时间访问它们,不要认为它们是相同的。只是做作业。
现在,我想知道更快的方法是什么?
提前致谢。
答案 0 :(得分:2)
第二种方法更可取......除非您错误地使用'=='在代码 1 中的其他位置比较这些字符串。
你理由中的缺陷就在这里:
“在第一种方法中,我相信如果需要条件,因为如果它们的值相同,我不会因为分配操作而浪费时间。”
实际上,赋值运算符可能比if
测试更快,甚至忽略了进行String.equals
调用的成本。赋值只是复制对存储单元的引用,这非常便宜 2 。这不是你应该想到的“优化”的东西,除非你有明确的剖析证据证明它是一个瓶颈。
1 - 在这种情况下,两种方法之间实际上可能存在语义差异。但很有可能 方法都不会给你正确的答案。
2 - 在某些情况下,对一个对象字段的赋值可能比单个内存写入要贵一点......但即使这样,也不应该尝试优先进行优化。
答案 1 :(得分:1)
更多的计算罪是以效率的名义提出的(没有 必须实现它)比任何其他单一原因 - 包括 盲目的愚蠢。 -William A. Wulf
也就是说,Java的String.equals()通过比较长度然后比较每个字符来工作。
if (!response.name.equals(name)) {
name = response.name;
}
涉及字符串比较和可能的分配。
name = response.name;
总是涉及作业。
理论上情况2应该快于1.但是有很多因素会影响这两者的相对表现。
答案 2 :(得分:1)
如果你还没有证明这是一个瓶颈,那么你在其他地方的时间会更好。
话虽如此,检查一个字符串等于另一个字符串可能比赋值本身更昂贵。根据经验,这是我的猜测。
哪个过程更有效还取决于名称彼此不相等的频率。如果它们经常不相等,那么检查相等性肯定会减慢你的代码。
如果您真的担心,我建议为此创建基准,但请允许我重申,我觉得您的担忧是错误的。
过早优化会使代码的可读性降低,浪费时间。