2012-12-23 61 views
1

我正在重寫一個3年前編寫的數據可視化Web工具。從那時起,瀏覽器的JavaScript引擎已經變得更快,所以我正在考慮將部分工作從服務器轉移到客戶端。優化數據可視化Web應用程序的性能

在頁面上,數據在表格和地圖(或圖表)中可視化,它使用的是相同的數據,但方式不同,所以兩種準備顯示數據的算法是不同的。

在用戶與數據下拉選擇器(3主+ 2sub取決於3主)的每次交互之前,發送了3個Ajax請求,php完成所有工作並僅發回需要的數據(在html中爲表/ xml的圖表)非常微小的響應,沒有性能問題和JavaScript附加響應,並沒有比追逐更改事件更多。

所以表現得不錯,但在標準用戶的每一個變化必須等待Ajax響應:/

現在我的想法是在一個Ajax請求發送回一個JSON對象,只有在主的每一個變化3標準組合,然後讓javascript填充表中的數據以及ajaxsuccess上的圖表/地圖,然後再改變2個子標準。

我的猶豫與服務器發送的json的結構有關,負載的平衡。事實上,如果只有一種算法需要創建想要的json結構來顯示原始數據中的數據,我會將php處理數據到這個對象中,以便爲javascript處理而無需任何額外的處理;但也有2

所以

  • 如果我的PHP過程的數據,以創建2個對象(一個用於表/一個用於圖),我會加倍JSON響應&增加存儲器的大小在客戶端使用;我不喜歡這種方法,因爲這兩個對象包含相同的數據,只是結構不同&冗餘是邪惡的,不是嗎?

  • 如果我發送原始對象並讓javascript搜索要顯示的內容以及我在哪裏向客戶端提供大量工作 - 這也適用於每個子標準更改(或者我可以在ajaxsuccess上創建所有json對象所以他們在這個子標準變化的情況下準備好) - 在這裏,我用舊的瀏覽器/小公羊用戶喜中有憂...

(原始JSON對象及時治療,根據標準3KB之間變化和12kb,在500和2000之間的記錄)

我沒有發現最好的方法...

因此,對於這個單一的原始數據多個結構化對象的工作,你會有PHP(增加響應大小和發送冗餘數據)或JavaScript(增加JavaScript負載)處理原始數據?

由於一噸您的意見

+1

我們在這裏談論的數據是多少?除非你正在談論成千上萬的記錄,否則即使是一個較老的客戶端機器/瀏覽器也應該能夠處理這個問題(如果你正在處理那麼多的記錄,那麼你可能會遇到更大的問題,就像你描述的那樣)。只需傳遞原始數據一次,讓客戶端擔心渲染。 – DaveRandom

+0

對於3個主要標準的每個組合,原始數據是36個狀態*(在2到10個不同人口組之間)*(在4到6個不同的結果類型之間) - > 300和2000個記錄之間(stateid,resulttypeid,groupid,百分比) – mikakun

+0

增加,有3個主要標準60個不同的組合(因此總共大約100 000記錄在db中,因此我選擇從服務器請求數據不會超過這個級別);輔助問題是:在用戶請求另一個組合的數據後,將先前的原始數據保留在客戶端存儲器中是明智的做法(加上:如果返回先前看到的數據,則不會再發送ajax請求;否則:如果查看多個組合,在客戶端內存中有數十個對象,每個平均有千條原始記錄) – mikakun

回答

0

我找到了一個合適的解決方案,所以我會回答我的問題。

我跟隨@ Daverandom的建議是:

  • PHP將原始數據

  • 的JavaScript處理原始數據和(一對夫婦的參數取決於主要標準結合一起)在頁面中渲染它

  • 如果子標準發生變化,JavaScript會重新處理原始數據,因爲測試循環過程看起來非常快並且不會凍結瀏覽器,所以它e不需要將結構化對象保留在範圍內

  • 使用JSON AJAX響應發送攻擊性緩存標頭(這些數據永遠不會更改 - 每年僅添加新記錄),以防用戶重新諮詢已有數據已經被查閱過了:如果原始數據沒有被顯示,那麼原始數據不會保存在JavaScript範圍內

  • 最重要的是,由php回顯的JSON字符串被緩存在服務器上(因爲這些數據永遠不會改變)減少數據庫查詢並提高響應時間

最終代碼是整潔,易於維護,並且應用程序完美無瑕。

感謝@Daverandom的幫助。

+0

我已經做了類似的操作。我傾向於給客戶一個巨大的數據負載並讓他們處理它。開銷和所有等待不必要的http響應通常是跛腳的。 – goat

+0

什麼是巨大的?我想我是來自舊學校,因爲對於我來說,將以前的服務器工作的一部分轉移到客戶端是一件大事! – mikakun

+1

我想我已經漲到了100k左右的前gzip - 而且我會走得更遠。我這樣做的交互速度。數據可視化/許多不斷變化的標準是一個很好的用例。所以,通用數據篩選就是爲了找到某些記錄 - 當搜索結果接近即時時,這真的很不錯,因爲所有數據都在瀏覽器內存中,而且您永遠不需要訪問網絡。我甚至在收到數據後就在數據上建立了微不足道的索引,這樣我就不需要對這麼多記錄進行巨大的線性循環。 – goat