最近的storm项目中,遇到一个java执行效率的问题,逻辑虽然简单,但经过优化,却提升不少,看来以后不得不花更多的时间关注效率问题了,尤其是实时处理场景。
先下一番结论:
1、java中subString、split、stringTokenizer三种截取字符串方法的性能比较
StringTokenizer在截取字符串中效率最高,不论数据量大小,几乎持平。substring则要次之,数据量增加耗时也要随之增加。split则是表现最差劲的。
简单来说:stringTokenizer > subString > split
测试文章:http://blog.csdn.net/songylwq/article/details/9016609
2、java中5种字符串拼接方式性能比较
用+的方式效率最差,concat由于是内部机制实现,比+的方式好了不少。Join 和 StringBuffer,相差不大,Join方式要快些。StringBuilder的速度最快,但其有线程安全的问题。
简单来说:StringBuilder > Join > StringBuffer > concat > +
测试文章:http://blog.csdn.net/kimsoft/article/details/3353849
不人云亦云,文章的示例,我也测试了,结论一致,不罗嗦了,但是我发现了另外一个问题,且看下文。
先看示例:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.StringTokenizer; /** * Created by MangoCool on 2017/4/1. */ public class Java_Split_Add_Test { private final Logger logger = LoggerFactory.getLogger(this.getClass()); public static void main(String[] args) { String data = "zhangsan|430103199001231998|27|男|党员|未婚|计算机|178cm|70kg|18889896868"; long st = System.nanoTime(); str_split_add(data); new Java_Split_Add_Test().logger.info("str_split_add cost {} ms", (System.nanoTime()-st)/1000000); st = System.nanoTime(); str_split_append(data); new Java_Split_Add_Test().logger.info("str_split_append cost {} ms", (System.nanoTime()-st)/1000000); st = System.nanoTime(); str_substring_append(data); new Java_Split_Add_Test().logger.info("str_substring_append cost {} ms", (System.nanoTime()-st)/1000000); st = System.nanoTime(); str_stringtokenizer_append(data); new Java_Split_Add_Test().logger.info("str_stringtokenizer_append cost {} ms", (System.nanoTime()-st)/1000000); } public static void str_split_add(String data) { for(int i=0; i<20000000; i++) { String[] useInfos = data.split("\\|"); String zsString = useInfos[0] + "|" + useInfos[1] + "|" + useInfos[2] + "|" + useInfos[3] + "|" + useInfos[4] + "|" + useInfos[5] + "|" + useInfos[6] + "|" + useInfos[7] + "|" + useInfos[8] + "|" + useInfos[9]; } } public static void str_split_append(String data) { for(int i=0; i<20000000; i++) { String[] useInfos = data.split("\\|"); StringBuilder sb = new StringBuilder(); sb.append(useInfos[0]).append("|") .append(useInfos[1]).append("|") .append(useInfos[2]).append("|") .append(useInfos[3]).append("|") .append(useInfos[4]).append("|") .append(useInfos[5]).append("|") .append(useInfos[6]).append("|") .append(useInfos[7]).append("|") .append(useInfos[8]).append("|") .append(useInfos[9]); } } public static void str_substring_append(String data) { for(int i=0; i<20000000; i++) { StringBuilder sb = new StringBuilder(); String name = data.substring(0, 8); String cardNo = data.substring(9, 27); String age = data.substring(28, 30); String sex = data.substring(31, 32); String identity = data.substring(33, 35); String marriage = data.substring(36, 38); String profession = data.substring(39, 42); String height = data.substring(43, 48); String weight = data.substring(49, 53); String phoneNo = data.substring(54, 65); sb.append(name).append("|") .append(cardNo).append("|") .append(age).append("|") .append(sex).append("|") .append(identity).append("|") .append(marriage).append("|") .append(profession).append("|") .append(height).append("|") .append(weight).append("|") .append(phoneNo); } } public static void str_stringtokenizer_append(String data) { for(int i=0; i<20000000; i++) { StringTokenizer token = new StringTokenizer(data,"|"); StringBuilder sb = new StringBuilder(); while (token.hasMoreTokens()) { sb.append(token.nextToken()).append("|"); } } } }
运行结果:
结论:从代码和结果看到,很意外为什么str_stringtokenizer_append时间如此之长,是的,这就是我想说的问题。
分割速度stringTokenizer > subString > split,没问题。
但如果需要使用分割后的数据,比如说拼接起来,或者存入集合等。这个效率确实令人失望,问题都在token.nextToken()方法上。
不信?自己测!
而如果只是统计分割后字符个数,stringTokenizer绝对值得使用。
罗嗦了这么多,就这么一个结论,好无聊!
分享:
崇尚极简,热爱技术,喜欢唱歌,热衷旅行,爱好电子产品的一介码农。
联系QQ:58742094
联系电话:
工作邮箱:
当你的才华还撑不起你的野心的时候,你就应该静下心来学习,永不止步!
人生之旅历途甚长,所争决不在一年半月,万不可因此着急失望,招精神之萎葸。
Copyright 2015- 芒果酷(mangocool.com) All rights reserved. 湘ICP备14019394号
免责声明:本网站部分文章转载其他媒体,意在为公众提供免费服务。如有信息侵犯了您的权益,可与本网站联系,本网站将尽快予以撤除。