在Grails和Groovy中,字符串(单引号)的表现优于GStrings吗?

Tri*_*hST 2 performance groovy gstring

由于Grails和Groovy中,单引号字符串是从GString的(双引号字符串允许$ {变量}值注射)不同的类,它是更有效的使用单引号,当正在使用的$ {变量}除?我猜测双引号的存在将需要解析普通的单引号字符串不需要的字符串.因此,我希望从寻找$ {}的额外时间中获得非常轻微的性能影响.

因此,除非使用双引号具有特定优势,否则通常有一个鼓励使用单引号的约定似乎是有益的.我是不是基地?

dma*_*tro 6

看看Double Quoted String下的第一个音符.

java.lang.String如果没有插值表达式,双引号字符串是普通的,但如果存在插值则是groovy.lang.GString实例.

这是可能的,因为插值是懒惰地检测到的,因此确定是否将其称为GString或String.例如,尝试下面的断言:

assert 'sample'.class.simpleName == 'String'
assert "sample".class.simpleName == 'String'
assert "sample ${1 != 2}".class.simpleName == 'GStringImpl'
Run Code Online (Sandbox Code Playgroud)

上面的第二个断言清楚地表明双引号是String默认的,直到有插值(如第三个断言).

因此,只要插值不存在,使用单引号或双引号都无关紧要.但是,我个人认为在使用String或使用规模方面不应该担心性能优势GString.


Jef*_*own 6

除了使用 ${variables} 之外,使用单引号是否更有效?

No。对于使用no的场景${variables},它们的表现是完全相同的。如果双引号字符串中没有,${variables}则系统不会创建GString. 它创建了一个标准java.lang.String。

编辑以解决下面评论中发布的单独问题:

它发生在编译时。代码如下:

void someMethod(String a) {
    def s1 = "some string"
    def s2 = "some string with arg ${a}"
}
@groovy.transform.CompileStatic
void someOtherMethod(String a) {
    def s1 = "some string"
    def s2 = "some string with arg ${a}"
}
Run Code Online (Sandbox Code Playgroud)

编译为:

public void someMethod(String a)
{
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    Object s1 = "some string";
    Object s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}

public void someOtherMethod(String a)
{
    String s1 = "some string";
    GString s2 = new GStringImpl(new Object[] { a }, new String[] { "some string with arg ", "" });
}
Run Code Online (Sandbox Code Playgroud)