为了账号安全,请及时绑定邮箱和手机立即绑定

遍历字符串中所有字符的最快方法

遍历字符串中所有字符的最快方法

不负相思意 2019-12-06 14:06:07
在Java中,迭代字符串中所有字符的最快方法是:String str = "a really, really long string";for (int i = 0, n = str.length(); i < n; i++) {    char c = str.charAt(i);}或这个:char[] chars = str.toCharArray();for (int i = 0, n = chars.length; i < n; i++) {    char c = chars[i];}编辑:我想知道的是,charAt在长时间的迭代过程中重复调用该方法的开销是否小于还是大于toCharArray在开始时执行一次单次调用然后在迭代过程中直接访问数组的开销。如果有人可以针对不同的字符串长度提供可靠的基准测试,那将是一个很好的选择,不仅要考虑到JIT的预热时间,JVM的启动时间等,而且还不只是两次调用的区别System.currentTimeMillis()。
查看完整描述

3 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

这只是您不应该担心的微观优化。


char[] chars = str.toCharArray();

返回一个str字符数组的副本(在JDK中,它通过调用返回一个字符的副本System.arrayCopy)。


除此之外,str.charAt()仅检查索引是否确实在范围内,并在数组索引内返回一个字符。


第一个不会在JVM中创建额外的内存。



查看完整回答
反对 回复 2019-12-07
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

如果需要处理大量数据,则不应在客户端模式下使用JVM。客户端模式并非用于优化。


让我们在客户端模式和服务器模式下使用JVM比较@Saint Hill基准测试的结果。


Core2Quad Q6600 G0 @ 2.4GHz

JavaSE 1.7.0_40

另请参见:“ java -server”和“ java -client”之间的真正区别?


客户模式:


len =      2:    111k charAt(i),  105k cbuff[i],   62k new[i],   17k field access.   (chars/ms) 

len =      4:    285k charAt(i),  166k cbuff[i],  114k new[i],   43k field access.   (chars/ms) 

len =      6:    315k charAt(i),  230k cbuff[i],  162k new[i],   69k field access.   (chars/ms) 

len =      8:    333k charAt(i),  275k cbuff[i],  181k new[i],   85k field access.   (chars/ms) 

len =     12:    342k charAt(i),  342k cbuff[i],  222k new[i],  117k field access.   (chars/ms) 

len =     16:    363k charAt(i),  347k cbuff[i],  275k new[i],  152k field access.   (chars/ms) 

len =     20:    363k charAt(i),  392k cbuff[i],  289k new[i],  180k field access.   (chars/ms) 

len =     24:    375k charAt(i),  428k cbuff[i],  311k new[i],  205k field access.   (chars/ms) 

len =     28:    378k charAt(i),  474k cbuff[i],  341k new[i],  233k field access.   (chars/ms) 

len =     32:    376k charAt(i),  492k cbuff[i],  340k new[i],  251k field access.   (chars/ms) 

len =     64:    374k charAt(i),  551k cbuff[i],  374k new[i],  367k field access.   (chars/ms) 

len =    128:    385k charAt(i),  624k cbuff[i],  415k new[i],  509k field access.   (chars/ms) 

len =    256:    390k charAt(i),  675k cbuff[i],  436k new[i],  619k field access.   (chars/ms) 

len =    512:    394k charAt(i),  703k cbuff[i],  439k new[i],  695k field access.   (chars/ms) 

len =   1024:    395k charAt(i),  718k cbuff[i],  462k new[i],  742k field access.   (chars/ms) 

len =   2048:    396k charAt(i),  725k cbuff[i],  471k new[i],  767k field access.   (chars/ms) 

len =   4096:    396k charAt(i),  727k cbuff[i],  459k new[i],  780k field access.   (chars/ms) 

len =   8192:    397k charAt(i),  712k cbuff[i],  446k new[i],  772k field access.   (chars/ms) 

服务器模式:


len =      2:     86k charAt(i),   41k cbuff[i],   46k new[i],   80k field access.   (chars/ms) 

len =      4:    571k charAt(i),  250k cbuff[i],   97k new[i],  222k field access.   (chars/ms) 

len =      6:    666k charAt(i),  333k cbuff[i],  125k new[i],  315k field access.   (chars/ms) 

len =      8:    800k charAt(i),  400k cbuff[i],  181k new[i],  380k field access.   (chars/ms) 

len =     12:    800k charAt(i),  521k cbuff[i],  260k new[i],  545k field access.   (chars/ms) 

len =     16:    800k charAt(i),  592k cbuff[i],  296k new[i],  640k field access.   (chars/ms) 

len =     20:    800k charAt(i),  666k cbuff[i],  408k new[i],  800k field access.   (chars/ms) 

len =     24:    800k charAt(i),  705k cbuff[i],  452k new[i],  800k field access.   (chars/ms) 

len =     28:    777k charAt(i),  736k cbuff[i],  368k new[i],  933k field access.   (chars/ms) 

len =     32:    800k charAt(i),  780k cbuff[i],  571k new[i],  969k field access.   (chars/ms) 

len =     64:    800k charAt(i),  901k cbuff[i],  800k new[i],  1306k field access.   (chars/ms) 

len =    128:    1084k charAt(i),  888k cbuff[i],  633k new[i],  1620k field access.   (chars/ms) 

len =    256:    1122k charAt(i),  966k cbuff[i],  729k new[i],  1790k field access.   (chars/ms) 

len =    512:    1163k charAt(i),  1007k cbuff[i],  676k new[i],  1910k field access.   (chars/ms) 

len =   1024:    1179k charAt(i),  1027k cbuff[i],  698k new[i],  1954k field access.   (chars/ms) 

len =   2048:    1184k charAt(i),  1043k cbuff[i],  732k new[i],  2007k field access.   (chars/ms) 

len =   4096:    1188k charAt(i),  1049k cbuff[i],  742k new[i],  2031k field access.   (chars/ms) 

len =   8192:    1157k charAt(i),  1032k cbuff[i],  723k new[i],  2048k field access.   (chars/ms) 

结论:


如您所见,服务器模式要快得多。



查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 552 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信