2013-07-25 26 views
0

在我的公司,我們最近一直在努力修改該使用下面的邏輯來執行一些數據庫字段分配現有的程序:進展4GL性能提升,避免數據庫寫操作

db-buffer1.field1 = if db-buffer1.field1 <> db-buffer2.field2 
         then db-buffer2.field2 
         else db-buffer1.field1 

我這裏不是100%的原程序員的意圖。任何人都可以幫助我瞭解在決定是否分配新字段之前比較字段值是否不同的價值?

如果比較結果爲「假」,我們最終分配db-buffer1.field1 = db-buffer1.field1我們避免數據庫上的寫操作?

另外請注意,這個例子是一個包含運行類似的分配/比較邏輯的幾個字段較大ASSIGN語句的一部分。這對這個附加代碼的價值有什麼影響嗎? (即,爲了避免數據庫寫入,是否必須成功執行ASSIGN語句中的所有比較)

回答

0

表達式右側的「IF函數」很像C或「三元運算符」 Javascript(「?:」構造)。

它隻影響它所屬的ASSIGN部分。當我使用這些代碼編寫代碼時,我總是將它包裝在父項中以清楚地說明。像這樣:

assign 
    a = (if x = y then b else c) 
    z = 2 
. 

WRITE是否發生取決於其他代碼。

只有這個片段中,你會寫東西(至少在邏輯上)來看。無論如何,db-buffer.field1都將獲得分配給它的值。如果它是field1或field2,右邊的IF邏輯只是選擇。在歸結爲field1 = field1的情況下,您可能希望某個較低層將優化寫入存在。我沒有看到你的Progress版本發佈,但如果它是V9或更好,那麼它可能會被優化掉。 (在此之前V9它會不會遲到了。)

如果你真的想「避免寫」在應用層面,你應該這樣的代碼是:

if field1 <> field2 then 
    assign 
    field1 = field2 
    . 

這種形式不使用IF函數,它只是一個正常的IF ... THEN語句。它更清晰,並且不依賴於較低級別的優化。當然,所顯示的代碼片段被認爲是更大的ASSIGN的一部分 - 因此,如我所示,將其分解並寫入它可能會也可能不明智。但這是值得思考的。

+0

指出,「在這種歸結爲字段1 =字段1你可能希望一些下層將優化寫出存在的情況下」 - 這幾乎是什麼我不知道。我們正在運行10.05B.32。除非Progress正在優化寫入 - 我沒有看到任何理由讓代碼與額外的IF/THEN邏輯進行卷積,因爲最終字段1將具有相同的值,無論如何。 – pmartin

+0

...即使Progress確實優化了較低層的寫操作,我們實際上只是用一個比較操作來替換寫操作。當然,比較速度更快,但我不相信性能增益如此重要,以至於它可以保證代碼對於未來的維護程序員來說可讀性和可讀性要低得多。 – pmartin

+0

我同意。這很愚蠢,幾乎沒有意義,一點也不清楚。 –

0

看來,程序員檢查,如果字段1不等於FIELD2繼續和更新。

他們還不如簡單地使用下面的,因爲無論哪種方式的領域正在被分配:

assign db-buffer1.field1 = db-buffer2.field2. 

當使用ASSIGN語句(總是推薦),從你要記住,每一個邏輯的角度線分開分配。

Tom has a great answer here給出了關於ASSIGN語句的效率/歷史的更多信息。

0

我對看到assign語句的其餘部分非常感興趣,但是在這種情況下我也會擺脫if邏輯,因爲它不增加任何值,只是額外的指令。由於特里以上

ASSIGN db-buffer1.field1 = db-buffer2.field2.