我已经全神贯注地寻找这个答案了,我倾向于认为答案是肯定的:
我正在创建一个迷你应用程序来帮助进行静态代码分析。为了使它尽可能快地运行,我需要了解使用groovy / java的语言如何处理这些字符串。我遇到的问题是了解代码天气:
res1 %>% group_by(Age_Group = age_group) %>%
summarise(Count = n_distinct(ID))
或
space.matcher(line.get(index)).replaceAll("")
当在if和while语句的比较中使用时,将保存由Pattern.matcher()。replaceAll()创建的字符串,或者从列表中检索到的堆栈,如在其他文本创建中那样:
line.get(index)
我正在询问,以便我可以查看当我将来对已创建或检索到的字符串进行反馈时,我是否完全重新创建字符串,或者如果我只是抓住对已经制作的堆栈上的litteral的引用以便将来对这些相同字符串的引用会更快,或者如果我最好将本地字符串保存为每个步骤的litterals以便更快地访问?
答案 0 :(得分:0)
使用groovy控制台的AST浏览器检查
的输出'string a'.replaceAll("")
生成的字节码是
// access flags 0x1
public run()Ljava/lang/Object;
L0
INVOKESTATIC script1467995483671.$getCallSiteArray ()[Lorg/codehaus/groovy/runtime/callsite/CallSite;
ASTORE 1
L1
LINENUMBER 1 L1
ALOAD 1
LDC 1
AALOAD
LDC "string a"
LDC ""
INVOKEINTERFACE org/codehaus/groovy/runtime/callsite/CallSite.call (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
ARETURN
L2
ACONST_NULL
ARETURN
LOCALVARIABLE this Lscript1467995483671; L0 L2 0
MAXSTACK = 3
MAXLOCALS = 2
显示从常量池添加到堆栈的字符串,请参阅 bytecode instructions