0

假设我有一个包含以下值的个人资料页面:姓名、姓氏、用户名、关注者和关注人数。

用户登录我的应用程序后,它们可能会更新。所以有一个刷新按钮。当用户单击刷新按钮时,我正在调用 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条件 (nameresponse.name) 中的两个值,而不是浪费时间访问它们,而不是考虑它们是否相同。做任务就行了。

现在,我想知道更快的方法是什么?

提前致谢。

4

3 回答 3

2

第二种方法更可取……除非您错误地使用 '==' 在代码1的其他地方比较这些字符串。

你推理的缺陷在这里:

“在第一种方法中,我相信如果需要条件,因为如果它们的值相同,我不会在分配操作上浪费时间。”

事实上,赋值运算符很可能比if测试更快,甚至忽略调用的成本String.equals。赋值只是复制一个对内存单元的引用,这真的很便宜2。这不是你应该考虑“优化”的事情,除非你有可靠的分析器证据证明它是一个瓶颈。


1 - 在这种情况下,这两种方法之间实际上可能存在语义差异。但很可能这两种方法都不会给你正确的答案。

2 - 在某些情况下,对对象字段的分配可能比单个内存写入更昂贵......但即便如此,您也不应该尝试抢先优化。

于 2013-08-10T04:07:45.393 回答
1

以效率为名(不一定实现效率)比任何其他单一原因(包括盲目愚蠢)犯下的计算罪都更多。——威廉·A·沃尔夫

也就是说,Java 的 String.equals() 通过比较长度然后比较每个字符来工作。

if (!response.name.equals(name)) {
 name = response.name;
}

涉及字符串比较和可能的赋值。

name = response.name; 

总是涉及一项任务。

理论上情况 2 应该比 1 快。但是有很多因素会影响这两者的相对性能。

于 2013-08-10T03:47:37.653 回答
1

如果你还没有证明这是一个瓶颈,你的时间最好花在其他地方。

话虽如此,检查一个字符串是否等于另一个字符串可能比赋值本身更昂贵。这是我根据经验的猜测。

哪个过程更有效还取决于名称彼此不相等的频率。如果它们经常不相等,检查相等肯定会减慢你的代码。

如果您真的担心,我建议为此创建基准,但让我重申一下,我觉得您的关注是错误的。

过早的优化会使代码的可读性降低,并且浪费时间。

于 2013-08-10T04:07:26.140 回答