在本期文章中,西安達內Java培訓(http://www.xatarena.cn)講師將探討 Java 下一代語言中的內存化。
內存化這個詞是 Donald Michie(一位英國人工智能研究人員)發明的,用于表示重復的值的函數級緩存。如今,內存化在函數式編程語言中很常見,它要么被用作一個內置特性,要么被用作一個相對容易實現的特性。
內存化在以下場景中很有幫助。假設您必須反復調用一個注重性能的函數。一個常見解決方案是構建內部緩存。每次計算某個參數集的值時,您都會將該值放入緩存中,作為參數值的線索。在未來,如果該函數使用以前的參數調用,那么它將會從緩存返回值,而不是重新計算它。函數緩存是一種經典的計算機科學權衡:它使用更多內存(我們常常擁有豐富的內存)來不斷實現更高的性能。
函數必須是純粹的,緩存技術才能發揮其作用。純函數 是沒有副作用的函數:它沒有引用任何其他易變的類字段,沒有設置除返回值以外的任何值,而且僅依賴于參數作為輸入。java.lang.Math 類中的所有方法都是純函數的良好示例。顯然,只有在函數可靠地為一組給定的參數返回相同值時,您才能成功地重用緩存的結果。
Groovy 中的內存化
內存化在 Groovy 中很簡單,Groovy 在 Closure 類上包含一系列 memoize() 函數。例如,假設您有一個昂貴的哈希算法,以至于您需要緩存結果來提高效率。為此,您可以使用閉包塊語法來定義方法,在返回時調用 memoize() 函數,如清單 1 所示。我并不是暗示清單 1 中使用的 ROT13 算法(即凱撒密碼 的一個版本)的性能面臨挑戰,只是假設緩存在這個示例中很重要。
清單 1. Groovy 中的內存化
class NameHash {
def static hash = {name ->
name.collect{rot13(it)}.join()
}.memoize()
public static char rot13(s) {
char c = s
switch (c) {
case 'A'..'M':
case 'a'..'m': return c + 13
case 'N'..'Z':
case 'n'..'z': return c - 13
default: return c
}
}
}
class NameHashTest extends GroovyTestCase {
void testHash() {
assertEquals("ubzre", NameHash.hash.call("homer")) }
} |
 |
|