Performance 在Grails和Groovy中,字符串(在单引号中)是否优于gstring?
由于在Grails和Groovy中,单引号字符串与gstring(允许${variable}值注入的双引号字符串)是不同的类,所以除了使用${variables}时,使用单引号是否更有效?我猜想,双引号的存在将需要解析普通单引号字符串不需要的字符串。因此,我希望在额外的时间内寻找${}的存在会对性能造成非常轻微的影响Performance 在Grails和Groovy中,字符串(在单引号中)是否优于gstring?,performance,groovy,gstring,Performance,Groovy,Gstring,由于在Grails和Groovy中,单引号字符串与gstring(允许${variable}值注入的双引号字符串)是不同的类,所以除了使用${variables}时,使用单引号是否更有效?我猜想,双引号的存在将需要解析普通单引号字符串不需要的字符串。因此,我希望在额外的时间内寻找${}的存在会对性能造成非常轻微的影响 因此,除非使用双引号有特殊的优势,一般来说,制定一个鼓励使用单引号的惯例似乎是有益的。我是否偏离了基准?请看下面的第一个音符 如果没有双引号,则双引号字符串是普通的java.lan
因此,除非使用双引号有特殊的优势,一般来说,制定一个鼓励使用单引号的惯例似乎是有益的。我是否偏离了基准?请看下面的第一个音符 如果没有双引号,则双引号字符串是普通的
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'
上面的第二个断言清楚地表明,默认情况下,双引号是String
,直到出现插值为止(如第三个断言)
因此,只要不存在插值,使用单引号或双引号并不重要。但是,我个人认为,在使用String
或GString
时,不应该担心性能方面的好处
除了${variables}之外,使用单引号是否更有效
有人在用吗
否。对于不使用${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}"
}
汇编如下:
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 ", "" });
}
我知道没有${variable}的字符串被视为类字符串,但我的问题更多地指向在将其标识为字符串之前会发生什么。难道不存在一个解析过程,它必须识别哪个类要使用,而这个类对于单引号字符串是不需要的吗?如果是这样,那么额外的解析是在编译时还是在运行时发生。如果是在运行时,那么我希望性能会有小的提高…@Victorst我已经在对上述答案的编辑中回答了您的问题。