从内存的角度来看,使用.each{}在Groovy中迭代集合而不是for循环有什么优点或缺点吗?
简单的示例: 在集合上使用.each{}:从内存的角度来看,使用.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
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