在調用一個空的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