51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2003|回复: 2
打印 上一主题 下一主题

[转贴] 让你月薪飙升的秘籍:Java性能调优的9个实用技巧 (中)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-2 11:24:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

但是之后你需要根据条件来修改字符串,会发生什么事情呢?

  

  你现在会有第二个StringBuilder,这个 StringBuilder 本来没有存在的必要,它会消耗堆内存,给 GC 增加负担。你应该这样写:

  

  2. 避免正则表达式

  正则表达式相对便宜和方便。但是如果你在N.O.P.E 分支,那很糟糕了。如果你必须在计算机密集的代码段中使用正则表达式,至少把Pattern的引用缓存下来,避免每次都对其重新编译:

  static final Pattern HEAVY_REGEX =

  Pattern.compile("(((X)*Y)*Z)*");

  但是如果你的正则表达式真的很简单,就像

  String[] parts = ipAddress.split("\\.");

  然后你真的最好诉诸普通的 char[] 或基于索引的操作。例如下面一段代码做了同样的事情:

  

  这也说明了为什么你不应该过早进行优化。与 split() 的版本相比,这简直不可维护。

  正则表达式很有用,但需要代价。如果你在N.O.P.E 分支,就必须避免正则表达式的代价。

  3. 不要使用 iterator()

  这个建议不太适用于常规用例,只适用于 N.O.P.E. 分支,但你也可以用用看。编写 Java-5 风格的 foreach 循环很方便。 你可以完全忽略循环内部变量,并编写:

  for(Stringvalue:strings){

  //Dosomethingusefulhere}

  然而,每当你运行到循环内部时,如果 string 是一个Iterable,你就要创建一个新的Iterator实例。如果你正在使用ArrayList,这将会在堆上分配一个含 3 个 int 的对象:

  privateclassItrimplementsIterator<E>{

  intcursor;

  intlastRet=-1;

  intexpectedModCount=modCount;

  //...

  相反,你可以编写以下代码——等价循环体,并且在栈上仅“浪费”一个 int 值,开销低:

  intsize=strings.size();for(inti=0;i<size;i++){

  Stringvalue:strings.get(i);

  … 或者,你可以选择不改变链表,在数组版本上使用同样的操作:

  for(Stringvalue:stringArray){

  //Dosomethingusefulhere}

  关键点

  从可写性和可读性以及从 API 设计的角度来看,Iterators、Iterable 和 foreach 循环都是非常有用的。但它们在堆上为每次单独的迭代创建一个小的新实例。 如果你运行这个迭代许多次,又想避免创建这个无用的实例,可以使用基于索引的迭代。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 07:02 , Processed in 0.063654 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表