2010-09-02 81 views
14

我想知道在原始計算能力方面,客戶端JavaScript與服務器端Java相比有多快。客戶端JavaScript與服務器端Java的速度有多快?

例如,排序。如果可能的話,是否應該在服務器端完成?如何迭代一個集合?

+0

除了下面提到的所有內容(服務器與客戶端資源,虛擬機中編譯的字節碼與解釋的腳本等等) - JavaScript的速度取決於瀏覽器。 – 2010-09-02 16:17:54

+0

我注意到Facebook爲了提高性能已經將工作轉移到JavaScript的[大型]服務器場上。 – 2010-09-02 16:20:48

回答

16

答案很複雜,取決於每個特定的情況。

服務器通常要比客戶端機器強大得多;託管代碼通常比腳本快得多。

但是 - 客戶端計算機通常還有很多未使用的備用計算能力,而服務器可能正在爲成千上萬的用戶運行請求。所以在這種情況下,可以卸載到客戶端的大部分工作是可取的。

你必須瞭解每個單獨的功能需求和用戶的期望,你的應用程序,並期待在相對負載與開發成本爲貴單位兩個環境之間的分裂發展,找出效果最好。例如,您的用戶可能期望您的網站不會凍結瀏覽器或導致不幸的「此網頁正在吃掉您的計算機」對話框,因此您的客戶端腳本應該被智能地編寫。這並不是說你不能在客戶端上做任何工作(你可以),你只需要聰明一點,記住它會阻塞UI線程。

+3

你也必須小心你有多少卸載到客戶端......你不想讓那個討厭的瀏覽器彈出說:「這個腳本花了太長時間......繼續/停止腳本」 – Zoidberg 2010-09-02 15:29:33

+0

還有回發問題。你在服務器端做的任何事情都需要回傳,至少會重新加載部分頁面。這需要往返服務器,並可能導致用戶失去他們在屏幕上的位置(這通常會讓用戶填寫表單或查看長頁面時感到煩惱)。如果你能做到客戶端,這不是問題;您可以通過AJAX緩解行爲問題,但是您仍然可能會遇到瀏覽器位置丟失的情況。當然,如果您的操作需要像DB這樣的服務器端資源,那麼操作只需要在服務器端進行處理。 – KeithS 2010-09-02 16:24:43

4

這兩樣東西不能並排比較。

有太多的因素,而且語言差異太大,而且服務條件差異太大,無法有效比較速度。

您確實需要根據具體情況決定您在哪裏進行計算。

如果客戶機需要做太多的工作,它會降低應用程序的性能,但如果服務器被要求做太多,它可以減慢響應時間爲大家。

5

這裏最大的不同點是虛擬機的速度。不同之處在於單臺服務器必須爲數十或數百個客戶端提供服務。另一個因素:到服務器的往返添加一個很多的開銷,所以你想要最小化它們。

基本上,任何不是安全關鍵的東西都可以在客戶端上輕鬆完成,應該在客戶端上完成

2

JavaScript是足夠快的方式來對客戶端上的數據進行排序。我已經將它與5000行的數據集一起使用,每行11個字段,並使用它對客戶端上的表進行排序(使用分頁)。這些排序使用比較函數,以便按字段和數據類型對行進行排序。該過程的實際Javascript部分採用了幾十毫秒(如果我記得〜80)的順序。

我的任何一天,而推那種平凡的任務下到客戶端,而不是堵塞了一個非常繁忙的服務器吧。因人而異。

8

服務器端Java肯定會運行得更快,則需要基準你的具體情況,但你可能在尋找一個10-20x速度優勢。

但是,可能沒有多大關係:無論原始計算能力我還是建議嘗試以下原因做盡可能多的計算儘可能客戶端的Javascript:

  • 即使速度降低20倍對用戶來說可能並不明顯
  • 當考慮客戶端到服務器通信的延遲時,在客戶端進行本地操作幾乎肯定會對用戶做出更好的響應
  • 臺客戶端機器可能不是CPU密集型的,所以對他們執行一些額外的代碼實際上是免費
  • 如果你可以卸載從服務器到客戶端的工作,你將需要更少的服務器端架構,當你需要它可以得到昂貴開始擴大
  • 有很多客戶到服務器的通信很可能你的架構複雜化,使其難以在未來開發新的功能。
  • 在客戶端上做計算往往可以降低帶寬要求

當然也有充分的理由讓事情在服務器如:

  • 安全問題(如果客戶不能被信任)需要
  • 非常大的數據集(將需要很長時間才能下載到客戶端)
  • 需要利用大規模並行計算(如谷歌搜索)
  • 避免需要考慮客戶的差異(例如Javascript版本)

但是,如果這些不適用,那麼我會嘗試儘可能推送給客戶端。

+0

+1好答案。您可以添加到優勢服務器列表中 - 不必太擔心客戶端瀏覽器支持哪種JavaScript版本。 – emory 2010-09-03 06:00:19

+0

好主意,加! – mikera 2010-09-03 09:26:44

2

不要使用JavaScript的mixup爪哇 - 名字相近,但它們是完全不同的語言。 JavaScript是一種客戶端,解釋型語言,Java是一種運行在虛擬機內的字節碼語言,在處理大量數據方面擁有更多的優化。 作爲一個事實,即運行Java服務的服務器通常擁有更多的權力(速度更快的CPU和磁盤I/O,更多的RAM)上的Java計算總是在我的經驗更快。 如果你想計算小數據(比如只排序幾百個元素),可以在客戶端使用Javascript。總而言之,你將不得不決定哪種方式更快:在服務器上計算和準備數據,並將它們傳輸到客戶端(通過互聯網傳輸是最大的放緩原因),或者計算數據已經在客戶端通過JavaScript。

我的建議是:如果有沒有你想在客戶端已經在客戶端是有意義的計算它們在服務器和傳輸已準備好的數據在客戶端的數據。但是,如果數據已經在客戶端,並且它們不超過幾百個,那麼在用戶的瀏覽器中計算它們的用戶體驗會更好。

0

這真的取決於你所運行代碼的盒子,數據有多大和可用性與工藝等因素的工作,再加上你不得不考慮通過導線,它是昂貴的發送數據。你必須平衡你將要做什麼,如果最好花費更多的時間處理事情,讓資源免費用於繁重的東西,並播放來回數據。