在调用空GORM构造函数和单独设置属性以及在构造函数中映射参数之间,在性能(或其他客观因素)方面是否存在差异?
即
Foo foo = new Foo()
foo.bar = 1
foo.baz = 2
vs
Foo foo = new Foo(bar: 1, baz: 2)
我一直更喜欢前者,但我想知道第二种是否更有效率。
答案 0 :(得分:7)
我不相信两者之间有任何效率增益。地图构造函数(第二个)在内部执行相同的操作。它可能会慢一点,因为它必须在地图上循环。
在现实世界中,表现无关紧要。更重要的是,你在这里进行微观优化,你真的不应该这样做。首先编写应用程序(仅担心宏优化)。如果您有实际的性能问题,请进行配置并进行更正。
至于使用哪个,它确实是个人偏好,但大多数Groovy开发人员会告诉你第二个更习惯,更容易阅读。打字也少得多。
最后,无论你选择什么,一如既往,要保持一致!
答案 1 :(得分:6)
我说没有显着的性能差异。我运行了一些测试,每个方向创建1000个对象,每种方式总是花费不到50毫秒,所以你可能在那时分裂头发。在这两个实例中都会调用setter(如果已实现),这样你就可以继续前进了。
我会选择更容易阅读的内容。至于一致性,总的来说我认为这很重要,但我会更容易阅读。如果您正在构建具有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}"
}
答案 2 :(得分:2)
我个人证实,对于域名类别而言,在表现方面受到了很大的打击。
在尝试解决性能问题时,我发现此博客条目Grails Domain Class Creation Performance已从映射样式构造函数调用更改,并在创建大量新实例时获得了10的因子(不是持久化BTW)。
我正在使用grails 2.01,所以问题(?)仍然存在。