首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译还是不编译模式?

编译还是不编译模式?
EN

Stack Overflow用户
提问于 2015-07-07 14:10:29
回答 1查看 109关注 0票数 1

我在做一个脚本代码生成器。我创建了一个模板脚本文件,其中包含少数参数和占位符的位置持有者,在生成过程中应该用实际值替换它。替换在循环中执行。生成器的性能是很重要的(目前在Java 7上)。我的困境如下:

做这样的事:

代码语言:javascript
复制
private final String PHOLDER_SECT = "#__PHOLD_SECT__#";
private final String PARAM_PID    = "__param_pid";
private final String PARAM_NAME   = "__param_name";
private final String PARAM_DESC   = "__param_desc";
...
for (int i = 0; i < sectionCount; i++) {

    // do something here...
    masterTmpl[i] = masterTmpl[i].replace(PHOLDER_SECT, someSectionCode);
    // something else here...
    masterTmpl[i] = masterTmpl[i].replace(PARAM_DESC, desc)
                                 .replace(PARAM_NAME, name)
                                 .replace(PARAM_PID,  pid)
    ...
}

或者类似的内容(要点是所有占位符都是已编写的模式):

代码语言:javascript
复制
private final Pattern regexSect = Pattern.compile("#__PHOLD_SECT__#", Pattern.LITERAL);
private final Pattern regexPid  = Pattern.compile("__param_pid",      Pattern.LITERAL);
private final Pattern regexName = Pattern.compile("__param_name",     Pattern.LITERAL);
private final Pattern regexDesc = Pattern.compile("__param_desc",     Pattern.LITERAL);
...
for (int i = 0; i < sectionCount; i++) {

    // do something here...
    masterTmpl[i] = this.regexSect.matcher(masterTmpl[i]).replaceAll(Matcher.quoteReplacement(someSectionCode));
    // something else here...
    masterTmpl[i] = this.regexDesc.matcher(masterTmpl[i]).replaceAll(Matcher.quoteReplacement(desc));
    masterTmpl[i] = this.regexName.matcher(masterTmpl[i]).replaceAll(Matcher.quoteReplacement(name));
    ...
}

我知道我可以测量执行情况,但是我希望有一个答案来解释模式编译在这种情况下的重要性.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 14:36:34

这段代码可能要快得多,因为它在单个搜索中发现模式的出现(而不是每个模式);最重要的是,所有替换都是在一次传递中完成的,而不是每个模式只需要一次。构建许多字符串有点昂贵,因为在最后一行中,复制和内存开销只构建了一个完全替换的字符串。

代码语言:javascript
复制
    public static String replaceMany(String input, 
            Map<String, String> replacements) {
        // build a composite pattern for all replacement keys
        StringBuilder sb = new StringBuilder();
        String prefix = "";
        for (String k : replacements.keySet()) {
            sb.append(prefix).append(Pattern.quote(k));
            prefix = "|";
        }
        Pattern p = Pattern.compile(sb.toString());
        // replace in single loop
        Matcher m = p.matcher(input);
        StringBuffer output = new StringBuffer();
        while (m.find()) {
            // inspired by http://stackoverflow.com/a/948381/15472
            m.appendReplacement(output, "");
            output.append(replacements.get(m.group(0)));
        }
        m.appendTail(output);
        return output.toString();
    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31270979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档