当前位置:  开发笔记 > 编程语言 > 正文

字符串与Java中的长性能

如何解决《字符串与Java中的长性能》经验,为你挑选了1个好方法。

正如我在另一个问题中所读到的那样,int比一个字符串具有更好的性能,而且性能稍好一些.

假设我有一个大于int的数字,我想用它来与相似的数字进行比较:什么类型的变量对这种情况有更好的表现?长还是字符串?

例如,将111.222.333.444与555.666.777.888进行比较:

long x = 111222333444;
long y = 555666777888;
if(x == y){ /*code*/ }

VS

string x = "111222333444";
string y = "555666777888";
if(x.equals(y)){ /*code*/ }

哪种情况有最好的表现?差异很大?



1> Stephen C..:

正如我在另一个问题中读到的那样,int的性能比长期好得多......

你读过的内容可能是错的.或者更可能的是,你从所读的内容中理解的是错误的.

确实,在某些机器上,a上的算术运算long 可能需要比类似int操作更长的时间.但是在现代机器上,可能没有差别(对于算术本身而言),即使存在差异,也只有1或2个时钟周期; 即纳秒.

所以"好多了"是夸大其词.

......比字符串表现更好一点.

那也是错的.实际上,对int值的操作比String对象上的操作要快得多.例如,考虑一下

String x = "111222333444";
String y = "555666777888";
if (x.equals(y)) { /*code*/ }

equals方法将执行以下操作:

    测试是否x == y返回true.

    测试if y是否为String,false如果不是则返回.

    测试2个字符串的长度是否相同,false如果不是则返回.

    循环遍历字符串中的字符,比较同一位置的字符,false如果它们不相等则返回.

    返回true如果循环结束,没有发现不相等的字符.

加上方法调用的开销(太大而不能内联).

我们正在讨论(我估计)20到30个机器指令,如果两个字符串相等或者在开始时相等则更多.

相比之下,x == y使用intlong只是一条指令1.


但是,这里有一个更重要的观点.

你实际上是在浪费时间在这里.除非你为数百万的数字进行这些操作,否则性能的差异可能不会引人注意.

我的建议是:

除非必须,否则不要进行优化.

除非必须,否则甚至不要考虑这种事情.

如果你必须(即你有真实的硬性能数字来表示你的代码太慢),那么就要科学地做.写一些基准测试,包括在>> real << data上运行>> real << code,并使用一个配置文件来确定代码实际花费大部分时间的位置.然后只优化代码的那些部分.


1 - 我不是指令级性能的专家,但是本文档似乎说英特尔CMP指令需要1个,2个或3个时钟周期.

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有