Translate-CS 板


LINE

原文網址:http://blog.oio.de/2014/03/28/gwt-rpc-deserialization-vs-ie8/ 譯文網址:http://blog.dontcareabout.us/2014/04/gwt-rpc-deserialize-ie8.html BBS 版以 markdown 語法撰寫 ______________________________________________________________________ 幾乎每個 web 開發人員都知道, 當 JS 執行時間過久 browser 就會跳出討厭的對話框問你要不要取消。 在 [IE 上頭]會顯示「這個網頁的指令碼造成 Internet Explorer 執行速度緩慢」。 這篇文章將說明 IE8 的特殊行為、 它如何影響 GWT RPC 的 deserialize 機制、 以及如何解決這些問題。 IE8 上的緩慢 JS --------------- 大多數 browser 在等待一段特定時間後(例如 5 秒), 會顯示前面提到的訊息。 這在 IE8 上有些不同,它判斷的依據是「執行 script 敘述的數量」, 預設是 500 萬個敘述。 這爛爆了,因為 2014 年典型的桌機執行起來不到 1 秒, 於是這就變成一個困擾。 所以,比起其他 browser,IE8 更難避免跳出那個訊息。 GWT RPC 與緩慢的執行速度 ------------------------ 在 GWT 中,我們有工具來避免這類問題。 關鍵是 [Scheduler class], 這能夠讓我們在一個新的 JS 區段(`scheduleDeferred`)執行程式碼, 所以計數器會重置。 即使 incremental execution 也是可以用 `Scheduler`。 有某些情況下是沒辦法單純把一些程式碼延遲執行來避免這些問題。 其中一種狀況是 GWT RPC 的 deserialize 行為。 下列的特性會增加 deserialize 行為的程式數量: * RPC 所要掌控的 class 數量 * data model 的複雜度 * 在一次 RPC 呼叫中傳輸的 data / object 數量 這裡有一些通用的建議可以協助優化 GWT RPC serialize 機制的效能: * 盡可能使用最具體的 interface / class * 不要在 GWT RPC 的參數、回傳值、或是內含的 field,用 `Serializable`。 * 另一個例子是:要用 `ArrayList` 而不是用 `List` * 只傳輸你真正需要的資料(包含仔入其他資料所需的 ID) 有趣的組合:Java Collection + GWT RPC ------------------------------------- 有一類問題是 Java Collection API 所導致的。 我最近遇到 JS 在 deserialize 時執行緩慢的問題, 傳輸的資料量小於 100KB。 這是重度使用 `HashSet` 跟 `HashMap` 所造成的。 在 deserialize 時會造成幾百萬行的 JS 敘述。 讓我們看看一個 Map 在 deserialize 時會發生什麼事: public static void deserialize( SerializationStreamReader streamReader, Map instance) throws SerializationException { int size = streamReader.readInt(); for (int i = 0; i < size; ++i) { Object key = streamReader.readObject(); Object value = streamReader.readObject(); instance.put(key, value); } } 這段程式碼用了正規的 `put()` 來增加所有的轉換值。 對 `HashMap` 而言會造成額外的 JS 敘述: * 作為 key 值的 object 會呼叫很多次 `hashCode()` / `equals()` * 找到正確的地方來插入 entry 的代價是很昂貴的 你把越多 entry 加到 `Map` 中,要付出的代價就越高。 這件事對 `HashSet` 也適用,因為它們使用相同的機制。 實際上,這些 `Map` 跟 `Set` 是用來優化存取多個 object 的狀況。 解決方法是用 `List`(就 deserialize 而言比較「便宜」)來傳輸資料, 然後到了 client 再對應到最佳化的資料結構。 用 transient field 是一個好用的技巧, 它會在傳輸 object 的時候隱藏起來不被處理: private List<MyType> data; private transient Map<MyKey, MyValue> optimizedData; public Map<MyKey, MyValue> getOptimizedData() { if(optimizedData == null) { optimizedData = optimizeIt(); } return optimizedData; } 如此會讓 `optimizedData` 這個 field 不會被 serialize。 在第一次存取資料時會作初始化的動作,然後 cache 起來留給後頭使用。 [IE 上頭]: http://support.microsoft.com/kb/175500 [Scheduler class]: http://www.gwtproject.org/javadoc/latest/com/google/gwt/core/client/Scheduler.html -- 錢鍾書: 說出來的話 http://www.psmonkey.org 比不上不說出來的話 Java 版 cookcomic 版 只影射著說不出來的話 and more...... --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.237.42
※ 文章網址: http://webptt.com/m.aspx?n=bbs/Translate-CS/M.1396341671.A.B39.html







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP