从内存的角度来看,使用.each{}在Groovy中迭代集合而不是for循环有什么优点或缺点吗?

从内存的角度来看,使用.each{}在Groovy中迭代集合而不是for循环有什么优点或缺点吗?,groovy,Groovy,简单的示例: 在集合上使用.each{}: def adults = Person.findAllByAgeGreaterThan(18) adults.each{adult -> //perform action on adult } def adults = Person.findAllByAgeGreaterThan(18) for(adult in adults){ //perform action on adult } 使用for对集合进行迭代: def

简单的示例:

在集合上使用.each{}:

def adults = Person.findAllByAgeGreaterThan(18)

adults.each{adult ->
    //perform action on adult
}
def adults = Person.findAllByAgeGreaterThan(18)

for(adult in adults){
    //perform action on adult
}
使用for对集合进行迭代:

def adults = Person.findAllByAgeGreaterThan(18)

adults.each{adult ->
    //perform action on adult
}
def adults = Person.findAllByAgeGreaterThan(18)

for(adult in adults){
    //perform action on adult
}

循环稍微好一点:例如,它不必创建
闭包
实例。细节取决于您的Groovy版本、编译器和JIT优化以及其他一些内容。如果需要确定,请通过内存分析器运行代码

但由于我们这里只讨论几十个字节,您不应该感到“我需要修复此代码”的冲动。这可能只是浪费时间(也就是说,修复它比让它去做更昂贵)

2014年


只有当性能真的很差,并且您使用探查器测量了它的性能时,才应该修复代码(即牺牲时间、可维护性和可读性以获得更好的性能)。

循环稍微好一点:例如,它不必创建一个
闭包
实例。细节取决于您的Groovy版本、编译器和JIT优化以及其他一些内容。如果需要确定,请通过内存分析器运行代码

但由于我们这里只讨论几十个字节,您不应该感到“我需要修复此代码”的冲动。这可能只是浪费时间(也就是说,修复它比让它去做更昂贵)

2014年


只有当性能真的很差,并且您使用探查器测量了它的性能时,才应该修复代码(即牺牲时间、可维护性和可读性以获得更好的性能)。

循环稍微好一点:例如,它不必创建一个
闭包
实例。细节取决于您的Groovy版本、编译器和JIT优化以及其他一些内容。如果需要确定,请通过内存分析器运行代码

但由于我们这里只讨论几十个字节,您不应该感到“我需要修复此代码”的冲动。这可能只是浪费时间(也就是说,修复它比让它去做更昂贵)

2014年


只有当性能真的很差,并且您使用探查器测量了它的性能时,才应该修复代码(即牺牲时间、可维护性和可读性以获得更好的性能)。

循环稍微好一点:例如,它不必创建一个
闭包
实例。细节取决于您的Groovy版本、编译器和JIT优化以及其他一些内容。如果需要确定,请通过内存分析器运行代码

但由于我们这里只讨论几十个字节,您不应该感到“我需要修复此代码”的冲动。这可能只是浪费时间(也就是说,修复它比让它去做更昂贵)

2014年



只有当性能真的很差,并且您使用探查器测量了为什么它不好时,才是修复代码的时候(即牺牲时间、可维护性和可读性以获得更好的性能).

可能重复的您可能会因为加载一个巨大的结果集而浪费更多的内存…@Opal是的,很抱歉它是重复的,更具体地说,我在搜索中找不到该帖子。@cfrick注意,这是一个简单的说明性示例。试着不要因为它而失眠。可能的重复你可能会因为加载一个巨大的结果集而浪费更多的内存…@Opal是的,很抱歉它是重复的,更具体地说,我在搜索中找不到那篇文章。@cfrick注意,这是一个简单的说明性示例。试着不要因为它而失眠。可能的重复你可能会因为加载一个巨大的结果集而浪费更多的内存…@Opal是的,很抱歉它是重复的,更具体地说,我在搜索中找不到那篇文章。@cfrick注意,这是一个简单的说明性示例。试着不要因为它而失眠。可能的重复你可能会因为加载一个巨大的结果集而浪费更多的内存…@Opal是的,很抱歉它是重复的,更具体地说,我在搜索中找不到那篇文章。@cfrick注意,这是一个简单的说明性示例。尽量不要为此而失眠。谢谢。我主要好奇的是,在闭包范围的语义中是否有任何东西会导致两者之间的内存差异。从你的回答来看,情况似乎并非如此。如果没有其他人觉得有必要插话,我会接受这一点。闭包是一个内部类,它会自动生成它引用的任何变量
final
。因此,它只创建一次,然后在整个循环中重复使用。这是否意味着闭包将生成自己的“成人”或闭包范围内任何其他变量的最终副本,并且由于“成人”和其他变量的两个实例,每个变量的内存使用量将翻倍?这取决于实现。但是在Groovy中,代码实际上可以修改外部变量。为此,您只需要传递一个在闭包存在时保持有效的引用。您不必复制变量。谢谢。我主要好奇的是,在闭包范围的语义中是否有任何东西会导致两者之间的内存差异。从你的回答来看,情况似乎并非如此。如果没有其他人觉得有必要插话,我会接受这一点。闭包是一个内部类,它会自动生成它引用的任何变量
final
。因此,它只创建一次,然后在整个循环中重复使用。这是否意味着闭包将生成自己的“成人”或闭包范围内任何其他变量的最终副本,并且由于“成人”和其他变量的两个实例,每个变量的内存使用量将翻倍?这取决于实现。但是在Groovy中,代码实际上可以修改外部变量。为此,您只需要传递一个refe