2017-02-14 100 views
1

也許這是一個愚蠢的問題,但我有這個疑問,我無法找到一個響應...... 如果我有複雜的對象列表上的地圖操作和使代碼更易讀我使用地圖裏面中間變量性能可以改變?在Scala中使用地圖中的變量會降低性能?

例如,這是相同的代碼的兩個版本:

profilesGroupedWithIds map { 
    c => 
    val blockId = c._2 
    val entityIds = c._1._2 
    val entropy = c._1._1 
    if (separatorID < 0) BlockDirty(blockId, entityIds.swap, entropy) 
    else BlockClean(blockId, entityIds, entropy) 
} 

..

profilesGroupedWithIds map { 
    c => 
    if (separatorID < 0) BlockDirty(c._2, c._1._2.swap, c._1._1) 
    else BlockClean(c._2, c._1._2, c._1._1) 
} 

正如你可以看到所述第一版本比第二個更具有可讀性。

但效率是一樣的嗎?或者我在地圖中創建的三個變量必須被垃圾收集器刪除,這會降低性能(假設'profilesGroupedWithIds'是一個非常大的列表)?

感謝

問候

盧卡

+0

[?哪匹馬更快](https://ericlippert.com/2012/12/17/performance-咆哮/) –

+0

考慮如何先進的是由JVM進行一些優化,像緩存友好性,數據局部性等等,還有幾乎沒有一個可以不運行基準測試針對特定的用途情況下說的。但是可以假設,這種差異會非常微不足道,我會選擇更易讀的版本,然後在出現一些實際的表達問題時開始分析。 –

+0

「程序員浪費大量的時間思考,也不必擔心,他們的節目非關鍵部分的速度,而這些嘗試的效率實際上有很強的負面影響,調試和維護等考慮時,我們應該忘記小的效率,說大約97%的時間:過早優化是萬惡之源。「 - [Donald Knuth](http://wiki.c2.com/?PrematureOptimization) – Vidya

回答

1

的丘壑只是別名,元組的元素。所以在這兩種情況下生成的java字節碼將是相同的,性能也會如此。

更重要的是,第一個變體是很多更好的代碼,因爲它清楚地表達了意圖。

這裏是第三變型中,其避免訪問元組元素_1和_2完全:

profilesGroupedWithIds map { 
    case ((entropy,entityIds),blockId) => 
    if (separatorID < 0) BlockDirty(blockId, entityIds.swap, entropy) 
    else BlockClean(blockId, entityIds, entropy) 
}