Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 在Grails和Groovy中,字符串(在单引号中)是否优于gstring?_Performance_Groovy_Gstring - Fatal编程技术网

Performance 在Grails和Groovy中,字符串(在单引号中)是否优于gstring?

Performance 在Grails和Groovy中,字符串(在单引号中)是否优于gstring?,performance,groovy,gstring,Performance,Groovy,Gstring,由于在Grails和Groovy中,单引号字符串与gstring(允许${variable}值注入的双引号字符串)是不同的类,所以除了使用${variables}时,使用单引号是否更有效?我猜想,双引号的存在将需要解析普通单引号字符串不需要的字符串。因此,我希望在额外的时间内寻找${}的存在会对性能造成非常轻微的影响 因此,除非使用双引号有特殊的优势,一般来说,制定一个鼓励使用单引号的惯例似乎是有益的。我是否偏离了基准?请看下面的第一个音符 如果没有双引号,则双引号字符串是普通的java.lan

由于在Grails和Groovy中,单引号字符串与gstring(允许${variable}值注入的双引号字符串)是不同的类,所以除了使用${variables}时,使用单引号是否更有效?我猜想,双引号的存在将需要解析普通单引号字符串不需要的字符串。因此,我希望在额外的时间内寻找${}的存在会对性能造成非常轻微的影响


因此,除非使用双引号有特殊的优势,一般来说,制定一个鼓励使用单引号的惯例似乎是有益的。我是否偏离了基准?

请看下面的第一个音符

如果没有双引号,则双引号字符串是普通的
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我已经在对上述答案的编辑中回答了您的问题。