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

时间:2016-03-11 00:59:25

标签: performance groovy gstring

因为在Grails和Groovy中,单引号字符串是与GStrings不同的类(双引号字符串允许$ {variable}值注入),使用单引号是否更有效,除非使用$ {variables}?我猜测双引号的存在将需要解析普通的单引号字符串不需要的字符串。因此,我希望从寻找$ {}的额外时间中获得非常轻微的性能影响。

因此,除非使用双引号具有特定优势,否则通常会有一个鼓励使用单引号的约定是有益的。我离开了吗?

2 个答案:

答案 0 :(得分: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'

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

因此,只要插值不存在,使用单引号或双引号就没有关系。但是,我个人认为在使用StringGString时,不应担心性能优势。

答案 1 :(得分:3)

  

使用单引号更有效,除了$ {variables}   正在使用?

没有。对于未使用UIView的情况,它们的执行完全相同。如果双引号String中没有${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}"
}