2012-01-06 70 views
0

在调用一个空的GORM构造函数和单独设置属性以及在构造函数中映射参数之间,性能(或其他客观因素)方面有差异吗?Grails构造函数 - 设置属性与映射参数

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

VS

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

我一直喜欢前者,但我想知道如果第二个是更有效的。

+1

我相信使用地图构造函数可以正确地使用数据绑定,而直接设置属性不会。不过,我并不十分确定。如果你将属性设置为与他们声明的类型不同的类型(例如从表单参数,它们都是字符串),这可能只是很重要。 – 2012-01-06 20:27:29

+2

因为直接设置属性可能不会经过任何数据绑定逻辑,所以*可能*会更快一些,但性能差异可能不会很大,特别是对于web应用程序。 @OverZealous是正确的 - 然后 - 描述你的应用程序,如果有必要的话*,针对需要提高性能的特定领域。 – 2012-01-07 18:35:53

回答

6

我会说没有显着表现差异。我进行了一些测试,每种方法创建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}" 
} 
+0

我大多数人都同意 - 当设置很多属性时,我会试图使用'foo。与{}',这消除了重复对象的所有视觉噪音。或者,您仍然可以使用地图构造函数,只是将地图分散在多行上。这最终看起来类似于'with'方法。我认为直的'foo.property = value'很少是最好的选择。 – OverZealous 2012-01-07 05:04:02

+1

你碰巧还有这些测试吗?这是博客文章的好材料,可以让人们有机会进行复制,并确保差异不会在不同平台或不同规模上发生变化。 – 2012-01-07 22:19:59

7

我不相信有任何两者之间的效率增益。地图构造函数(第二个)在内部做同样的事情。它可能慢一点,因为它必须在地图上循环。

在现实世界中,表现并不重要。更重要的是,你在这里微调优化,你真的不应该这样做。首先编写应用程序(仅关注宏观优化)。如果您有实际的性能问题,请进行配置并进行更正。

至于使用哪一个,它确实是个人偏好,但大多数Groovy开发者会告诉你,第二个更习惯,更易于阅读。打字也少得多。

最后,无论你选择,一如既往,保持一致!

+0

你不是第一个提出这一点,也不会是最后一个。可读性是这里唯一感兴趣的标准......这是主观的。 – 2018-02-28 14:00:13

2

我亲自证实,对于域类而言,在性能方面存在很大的影响。

在试图解决性能问题时,我发现这个博客条目Grails Domain Class Creation Performance已从地图样式构造函数调用中更改,并在创建大量新实例(不会被持久化)时获得了十分之一的因子。

我使用grails 2.01,所以问题(?)仍然存在。

+0

在2.3.7中,差异仍然是10的因子。不要使用任何大规模循环代码中基于地图的构造函数。 – Bulba 2014-07-03 10:51:47