快速业务通道

Eclipse的字符串分区共享优化机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
Snap.shareStrings(pool);   } } // // org.eclipse.core.internal.watson.ElementTree // public class ElementTree {   protected DeltaDataTree tree;   public void shareStrings(StringPool set) {    tree.storeStrings(set);   } } // // org.eclipse.core.internal.dtree.DeltaDataTree // public class DeltaDataTree extends AbstractDataTree {   private AbstractDataTreeNode rootNode;   private DeltaDataTree parent;   public void storeStrings(StringPool set) {    //copy field to protect against concurrent changes    AbstractDataTreeNode root = rootNode;    DeltaDataTree dad = parent;    if (root != null)     root.storeStrings(set);    if (dad != null)     dad.storeStrings(set);   } } // // org.eclipse.core.internal.dtree.AbstractDataTreeNode // public abstract class AbstractDataTreeNode {   protected AbstractDataTreeNode children[];   protected String name;   public void storeStrings(StringPool set) {    name = set.add(name);    //copy children pointer in case of concurrent modification    AbstractDataTreeNode[] nodes = children;    if (nodes != null)     for (int i = nodes.length; --i >= 0;)      nodes[i].storeStrings(set);   } }

Eclipse的字符串分区共享优化机制(4)

时间:2011-01-03

所有的需优化字符串,都会通过 StringPool.add 方法提交到统一的字符串缓冲池中。而这个缓冲池的左右,与 JVM 级的字符串表略有不同,它只是在进行字符串缓冲分区优化时,起到一个阶段性的整理作用,本身并不作为字符串引用的入口存在。因此在实现上它只是简单的对 HashMap 进行包装,并粗略计算优化能带来的额外空间,以提供优化效果的度量标准。

代码:

// // org.eclipse.core.runtime.StringPool // public final class StringPool {   private int savings;   private final HashMap map = new HashMap();   public StringPool() {    super();   }   public String add(String string) {    if (string == null)     return string;    Object result = map.get(string);    if (result != null) {     if (result != string)      savings += 44 + 2 * string.length();     return (String) result;    }    map.put(string, string);    return string;   }   // 获取优化能节省多少空间的大致估算值   public int getSavedStringCount() {    return savings;   } }

不过这里的估算值在某些情况下可能并不准确,例如缓冲池中包括字符串 S1,此时提交一个与之内容相同但物理位置不同的字符串 S2,则如果 S2 被提交多次,会导致错误的高估优化效果。当然如果需要得到精确值,也可以对其进行重构,通过一个 Set 跟踪每个字符串优化的过程,获得精确优化度量,但需要损失一定效率。

在了解了需优化字符串的提交流程,以及字符串提交后的优化流程后,我们接着看看 Eclipse 核心是如何将这两者整合到一起的。

前面提到 Workspace.open 方法会调用 InternalPlatform.addStringPoolParticipant 方法,将一个字符串缓冲池分区的根节点,添加到全局性的优化任务队列中。

代码:

// // org.eclipse.core.internal.runtime.InternalPlatform // public final class InternalPlatform {   private StringPoolJob stringPoolJob;   public void addStringPoolParticipant(IStringPoolParticipant participant, ISchedulingRule rule) {   if (stri

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号