瀏覽器上超快的多線程代碼:Clio
Clio 讓你在瀏覽器上運行多線程代碼
Clio 是一種函數式編程語言,可以編譯成 JavaScript。它既可以在 Node.js 上運行,也可以在瀏覽器中運行,並且在這兩個地方都是多線程的。Clio 使並行或分佈式編程變得超級容易,你可以輕鬆地使用本地設備上的 CPU 核心,或使用網絡上另一個設備上的資源。Clio 可以無限制地擴展。它有一個乾淨的語法,而且速度超快。你可以在 medium 上閱讀 Clio 的介紹,訪問我們的 GitHub 倉庫或網站,或者你可以直接進入我們的遊樂場,看看並嘗試一些例子。
不過,讓我向你展示一下 Clio 的快速演示,以及如何用它進行多線程。要在瀏覽器或 Node.js 上實現多線程,你所需要做的就是定義你的函數並使用 | sandwich | 語法來調用它們,Clio 會處理剩下的事情。
用 Clio 編寫的 Fib 函數
如果你願意,你可以直接在 Playground 上運行這個例子。
在這個例子中,有一些小細節需要解釋。在上面示例代碼的第 8 行,你可以看到 Clio 的三明治語法 | fib | 的演示,它在一個單獨的線程中運行 fib 函數。在同一行,你可以看到 -> * 被用來將數據映射到 | fib | 函數。在第 9 行,(console.log @it)是一個匿名函數,接受它作爲第一個參數。
通過 Clio,還可以通過網絡導入函數,並像其他常規函數一樣使用它們。有了 Clio,你不需要製作和實現 API 端點,只需託管你的函數並將其導入其他地方,Clio 免費爲你提供 FaaS 和微服務架構,沒有任何額外的麻煩。比如說
是有效的 Clio 代碼。要看遠程功能的演示,你可以在這裏查看我們的 todo 例子。
最近剛剛發佈的 Clio v0.11.0 版本帶來了一些重要的變化。這些變化主要與性能有關:它們提高了 Clio 代碼的執行速度,同時也提高了整體的 RPC 和多線程性能。在這篇文章中,我將向你展示 Clio 到底有多快,我們將一起去看看這些新的增強功能。讓我們從性能開始!
Clio 的速度有多快?
由於 Clio 編譯爲 JavaScript,每個人的第一個假設是 Clio 比較慢,或者和 JavaScript 一樣慢。對於 TypeScript 這樣的語言來說,這可能是真的,但 Clio 實際上比 JavaScript 快,在某些情況下,它比 JavaScript 快得多。我將在文章的後面解釋 Clio 如何實現這樣的性能。但現在,讓我們來看看我們正在談論的速度有多快。
Clio 的性能與其他語言相比
上圖顯示了用不同編程語言計算第 1000 個斐波那契數的執行時間。當然,我並不期望 Clio 總是或在其他任何情況下都這麼快,我也不主張 Clio 和 C 一樣快,我主張的是 Clio 超級快,而且在使其快速方面做了大量的工作。那麼,如果它編譯成 JavaScript,怎麼會這麼快呢?
首先,我應該提到,與一般人的想法相反,JavaScript 實際上是一種非常快的編程語言。由於 Clio 編譯爲 JavaScript,編譯器可以對生成的 JavaScript 應用編譯時優化。在上面的例子中,尾部調用優化被應用於 Fibonacci 函數。你可以在這裏找到該基準的源代碼。
Clio 運行速度比 JavaScript 快的另一個原因是 Clio 代碼的編寫方式:使用管道,可以避免創建中間的常量或變量。一個函數調用的輸出可以直接通過管道進入另一個函數,再從那裏進入另一個。當然,也可以在 JavaScript 中嵌套函數調用,避免產生中間變量,然而,Clio 的語法是精心設計的,允許這樣做,同時保持可讀性。例如,下面的 JavaScript 代碼。
在 Clio 中變成了這樣。
在上面的 JavaScript 例子中,函數的執行順序是從內到外,但在 Clio 代碼中,它從左到右被執行,與你讀和寫代碼的順序完全一致。如果你仔細想想,這就更有意義了!
爲了保持 Clio 的快速性,我們花了很多時間和精力,爲此我們不得不犧牲了不少功能。舉個例子,我們不得不放棄懶惰,因爲我們運行的 V8 引擎並不原生支持它。然而,我們確保 Clio 兼容保持 JavaScript。
因此,你現在可以將任何 JavaScript 庫導入 Clio 並使用它,而不會面臨任何問題。因此,你甚至可以受益於 Clio 的多線程功能,使你的 JavaScript 庫運行更快。
在上面的圖表中,你可以看到用 Clio 並行化你的任務是如何提高它們的性能的! 作爲一個例子,Jimp,一個純粹的 JavaScript 圖像處理庫被用來對一個充滿圖像的目錄應用灰度效果。有了 Clio,你可以在一個單獨的線程中對每張圖片應用效果,這大大改善了性能。在 Clio v0.11.0 版本中,我們做了大量的工作,使並行化的速度更快,效率更高,比以前好得多!
Clio 的併發性
Clio 有一個基於網絡的並行性模型。你可以稱它爲分佈式計算模型。在啓動時,Clio 會創建一箇中央集線器或消息代理,稱爲調度器,並根據項目的配置監聽不同協議上的連接。然後,它催生工人,並等待他們連接到調度器。調度器只是一個消息中樞或經紀人,在主線程和工作者之間轉發消息。工作者和主線程之間沒有共享內存,所以 Clio 必須對每一條消息進行序列化。
在 v0.11.0 版本之前,Clio 使用 JSON 進行序列化。JSON 隨處可見,而且速度相當快,所以一開始,使用 JSON 可能聽起來是個好主意。不幸的是,一旦我們開始用 JSON 序列化自定義類型,它的性能就會下降到不再有效的地步。爲了解決這個問題,我創建了一個名爲 Sia 的 JavaScript 序列化庫,爲了將其序列化性能提升到新的水平,我還設計了一個新的文本編碼,我稱之爲 utfz。我花了一年多的時間來優化這兩個庫,結果是成功地使 Sia 變得如此之快,以至於它的純 JavaScript 版本甚至超過了 Node.js 的本地序列化庫的性能
Clio Mandelbrot 的例子
Sia 是一種二進制序列化格式,正如你在上圖中看到的,Sia 的速度非常快如果想看更多的基準,或者想了解更多關於 Sia 以及它是如何做到如此之快的,你可以參考這篇媒介文章。使用 Sia 作爲一個序列化庫,Clio 在多線程、其遠程函數調用和 RPC 協議上獲得了很大的性能提升。
上圖顯示了我切換到 Sia 後 Clio 的性能提升。不僅是序列化數據的速度更快,現在傳輸數據的速度也更快。有了 Sia,序列化的數據比 JSON 小得多,而且已經是二進制格式了!在瀏覽器上,性能也大大提升。在瀏覽器上,性能也得到了極大的改善。對於一個快速的演示,你可以查看下面的視頻,看看 Clio Mandelbrot 的例子在 Sia 上的渲染速度與 JSON 相比有多快。
視頻顯示了用 Clio 編寫的多線程曼德布羅特例子的渲染時間。你可以在這裏查看它的運行情況,或者你可以在 GitHub 上查看源代碼。正如你所看到的,Sia 版本比 JSON 版本快得多,完成的時間幾乎是 JSON 版本的一半
使用 Clio,在一個線程中運行函數是超級簡單的,不需要自己設置任何東西,不需要處理網絡工作者或工作者線程,不需要實現通信協議或同步,一切都已經處理好了,只要運行 clio new 來構建一個新的項目,編寫你的代碼,然後運行 clio run 命令,你就可以在幾秒鐘內啓動和運行你的應用程序。你可以在 Clio 的例子庫中查看例子。
Clio 仍然是一種非常年輕的語言,它還有很長的路要走,它還不適合生產,我也不急於穩定發佈。我想保持它的最小化,我想仔細選擇哪些東西可以進入,哪些東西我們應該保留在語言之外。它的設計考慮到了雲和微服務,這也是主要焦點所在。對於 Clio,我的目標是一種在網絡上和網絡外都可以使用的通用語言,一種適合製作網站的語言,也適合計算數字和科學數據。
來源:
https://www.toutiao.com/a7012290243189621261/?log_from=9b777307c11cd_1634009672906
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/LhaP1gBs6e3IIe-OpoA5Qw