Grails构造函数 - 设置属性与映射的参数

时间:2012-01-06 19:50:41

标签: grails constructor

在调用空GORM构造函数和单独设置属性以及在构造函数中映射参数之间,在性能(或其他客观因素)方面是否存在差异?

Foo foo = new Foo()
foo.bar = 1
foo.baz = 2

vs

Foo foo = new Foo(bar: 1, baz: 2)

我一直更喜欢前者,但我想知道第二种是否更有效率。

3 个答案:

答案 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,所以问题(?)仍然存在。