2012-09-07 111 views
0

我最近在Silverlight 5.異步/等待性能5

進行一些測試以關於異步/ AWAIT(asyncctp)功能被用於這兩個測試下列硬件:

  • 英特爾SNB2.3克
  • 8克DDR
  • 的Windows 7 - 64位
  • 的Silverlight 5
  • SQL服務器2008 - R2

測試邏輯如下:

  1. 沒有異步/ AWAIT:

    public void LoadMasterItem(string strUNIT_ID) 
    { 
        **DateTime dt = DateTime.Now;** 
        ctx.OBS_UNITs.Clear(); 
        this.IsMasterItemBusy = true; 
        ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == strUNIT_ID)).Completed += (sender, e) => 
        { 
         this.MasterItem = ctx.OBS_UNITs.FirstOrDefault(); 
         this.IsMasterItemBusy = false; 
         LoadDataArgs args = ExceptionManager.CheckDataContextResult(sender, args); 
         **var ts = DateTime.Now.Subtract(dt).Ticks;** 
         **string str = ts.ToString();** 
        }; 
    } 
    
  2. 隨着異步/ AWAIT:

    public **async** Task<LoadDataArgs> LoadMasterItem(string UNIT_ID) 
    { 
        **DateTime dt = DateTime.Now;** 
        ctx.OBS_UNITs.Clear(); 
        var oper = await ctx.Load(ctx.GetOBS_UNITQuery().Where(p => p.UNIT_ID == UNIT_ID)).AsTask(); 
        LoadDataArgs args = ExceptionManager.CheckDataContextResult(oper); 
        if (args.LoadState) 
        { 
         this.MasterItem = oper.Entities.FirstOrDefault(); 
        } 
    
        **var ts = DateTime.Now.Subtract(dt).Ticks;** 
        **string str = ts.ToString();** 
        return args; 
    } 
    

蜱的實驗1:5304010
蜱爲實驗2:30001

我很好奇,爲什麼,以及如何使用異步/ AWAIT會提高我的Silverlight應用程序到這種程度顯著。如果我的測試「不公平」,請給我一些關於如何改進的評論。


我已將「str」值綁定到UI,而不使用調試模式。這些託管在IIS中並在IE9中執行。

的resuls如下:

蜱爲1:5504010個
蜱2:5680325

感謝您的答覆,看來我作出關於實際性能是錯誤的。

+0

您確定您的其他更改沒有效果嗎? – Jodrell

+0

這兩個樣本都稱爲用於查詢同一個表的相同ria服務。我還單獨運行了測試並關閉了其他應用程序。我已經在我大學的計算機上嘗試過,並獲得幾乎相同的結果。 – justin

+3

他們是否都得到相同的實際結果?請注意,您實際上並不*使用'str'做任何事情 - 所以您是如何觀察效果的?如果你在調試器中運行它,這很容易產生巨大的影響。在調試器外運行*,記錄效果。 –

回答

1

當您檢查第二個樣本中的時間時,我不認爲裝載操作實際完成。該方法返回異步執行的任務,並不一定意味着從異步方法返回時執行了加載。

+0

但是,當代碼步入「string str = ts」時,我通過調用UI中的第二種方法來獲得加載操作結果。ToString();「 – justin

+0

我個人覺得(也許有點主觀),在IE9中單獨運行它們之後,await樣本加載數據的速度比沒有對應數據時要快一些。 – justin

1

await運算符只是爲了幫助您的代碼在處理鏈式調用時更易讀並且更簡單。