2012-01-06 68 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

相關問題