2015-12-21 78 views
2

我有一個XQuery庫模塊,其中包含一些不帶參數的函數。 我正在考慮重寫這些函數作爲變量,使它更快訪問它們。XQuery:是否對導入的變量進行了懶惰評估?

但是,其中一些內容是計算昂貴的表達式。作爲函數,它們顯然只在被調用時才被評估。但作爲變量,我不確定在庫模塊導入時是否會自動評估它們。

只有一些導入此模塊的查詢會使用這些變量,並證明其評估正確。對於其他不使用變量的人來說,評估將是不必要的開銷。 ,

將不會有任何問題,但是如果是進口變量懶洋洋地評價:我可以導入庫模塊上的任何查詢,知道只有當實際主模塊使用這些昂貴的變量進行評估。

我知道這只是寫作prefix:myImportedFunction()$prefix:myImportedVariable有關,但這是我想消除的不確定性。

我相信這種行爲是依賴於實現的。我對BaseX和Saxon-HE的行爲特別感興趣。他們懶洋洋地評估導入的變量嗎?

回答

2

撒克遜人通常會對全局變量使用懶惰評估。如果啓用了運行時跟蹤(如果在IDE中進行調試,則可能會這樣做)。然後切換到急切的評估以使調試更易於處理。

2

在BaseX,只有那些變量將被優化(並且因此,可能是預先計算的),如果它們在執行代碼中引用。例如,在下面的表達式,$ V不會進行評估:選擇

declare variable $expensive := (1 to 100000000)[. = 1]; 
123 

訪問的變量的預評估,因爲它使許多後續優化在BaseX。然而,變量延遲計算可以通過添加Q{http://basex.org}lazy annotation強制執行:

declare namespace basex = 'http://basex.org'; 
declare %basex:lazy variable $expensive := (1 to 100000000)[. = 1]; 
(1, $expensive)[1] 
+0

還沒有收到有關的'lazy'註釋想法。偉大的提示;並感謝分享它。除此之外,我只想仔細檢查你提到的兩個關鍵詞:「執行代碼」。如果在_library module_中的另一個變量中引用昂貴的變量,而在_main module_中不引用,則$ expensive將不會被預先評估,因爲它不是已執行代碼的一部分。對? – ARX

+0

如果變量發生在主模塊或庫模塊中,它實際上並不重要。但是,如果變量在代碼中的某個地方被引用,它可以起到一定的作用。如果它出現在一個永遠不會被調用的函數中,它將不會被真正評估。 - 這有幫助嗎? –

+0

它的確如此!謝謝。 – ARX