在调用一个空的GORM构造函数和单独设置属性以及在构造函数中映射参数之间,性能(或其他客观因素)方面有差异吗?Grails构造函数 - 设置属性与映射参数
即
Foo foo = new Foo()
foo.bar = 1
foo.baz = 2
VS
Foo foo = new Foo(bar: 1, baz: 2)
我一直喜欢前者,但我想知道如果第二个是更有效的。
在调用一个空的GORM构造函数和单独设置属性以及在构造函数中映射参数之间,性能(或其他客观因素)方面有差异吗?Grails构造函数 - 设置属性与映射参数
即
Foo foo = new Foo()
foo.bar = 1
foo.baz = 2
VS
Foo foo = new Foo(bar: 1, baz: 2)
我一直喜欢前者,但我想知道如果第二个是更有效的。
我会说没有显着表现差异。我进行了一些测试,每种方法创建1000个对象,每种方法总是花费少于50毫秒,因此您可能在此时分割头发。在这两种情况下,调用者(如果实现的话)都被调用,所以你可以很好地继续前进。
我会去随便看什么。至于一致性,是的总体来说,我认为这很重要,但我会坚持更容易阅读。如果你正在构建一个包含20个属性的对象,那么地图可能不是最好的。如果你用4个属性构建它,那么也许它是有道理的。
下面是我跑的测试:
@Test
public void performance1() {
def times = []
10.times {
1000.times {
def startTime = System.currentTimeMillis()
def user = new User()
user.firstName = "Steve"
user.lastName = "Jobs"
def endTime = System.currentTimeMillis()
times << endTime - startTime
}
}
println "Average: ${times.sum()/10}"
}
@Test
public void performance2() {
def times = []
10.times {
1000.times {
def startTime = System.currentTimeMillis()
def user = new User(firstName: "Steve", lastName:"Jobs")
def endTime = System.currentTimeMillis()
times << endTime - startTime
}
}
println "Average: ${times.sum()/10}"
}
我大多数人都同意 - 当设置很多属性时,我会试图使用'foo。与{}',这消除了重复对象的所有视觉噪音。或者,您仍然可以使用地图构造函数,只是将地图分散在多行上。这最终看起来类似于'with'方法。我认为直的'foo.property = value'很少是最好的选择。 – OverZealous 2012-01-07 05:04:02
你碰巧还有这些测试吗?这是博客文章的好材料,可以让人们有机会进行复制,并确保差异不会在不同平台或不同规模上发生变化。 – 2012-01-07 22:19:59
我不相信有任何两者之间的效率增益。地图构造函数(第二个)在内部做同样的事情。它可能慢一点,因为它必须在地图上循环。
在现实世界中,表现并不重要。更重要的是,你在这里微调优化,你真的不应该这样做。首先编写应用程序(仅关注宏观优化)。如果您有实际的性能问题,请进行配置并进行更正。
至于使用哪一个,它确实是个人偏好,但大多数Groovy开发者会告诉你,第二个更习惯,更易于阅读。打字也少得多。
最后,无论你选择,一如既往,保持一致!
你不是第一个提出这一点,也不会是最后一个。可读性是这里唯一感兴趣的标准......这是主观的。 – 2018-02-28 14:00:13
我亲自证实,对于域类而言,在性能方面存在很大的影响。
在试图解决性能问题时,我发现这个博客条目Grails Domain Class Creation Performance已从地图样式构造函数调用中更改,并在创建大量新实例(不会被持久化)时获得了十分之一的因子。
我使用grails 2.01,所以问题(?)仍然存在。
在2.3.7中,差异仍然是10的因子。不要使用任何大规模循环代码中基于地图的构造函数。 – Bulba 2014-07-03 10:51:47
我相信使用地图构造函数可以正确地使用数据绑定,而直接设置属性不会。不过,我并不十分确定。如果你将属性设置为与他们声明的类型不同的类型(例如从表单参数,它们都是字符串),这可能只是很重要。 – 2012-01-06 20:27:29
因为直接设置属性可能不会经过任何数据绑定逻辑,所以*可能*会更快一些,但性能差异可能不会很大,特别是对于web应用程序。 @OverZealous是正确的 - 然后 - 描述你的应用程序,如果有必要的话*,针对需要提高性能的特定领域。 – 2012-01-07 18:35:53