分享

浏览器上超快的多线程代码:Clio

 菌心说 2021-09-27

Pouya Eghbali- 7分钟阅读

文章图片1

Clio让你在浏览器上运行多线程代码

Clio是一种函数式编程语言,可以编译成JavaScript。它既可以在Node.js上运行,也可以在浏览器中运行,并且在这两个地方都是多线程的。Clio使并行或分布式编程变得超级容易,你可以轻松地使用本地设备上的CPU核心,或使用网络上另一个设备上的资源。Clio可以无限制地扩展。它有一个干净的语法,而且速度超快。你可以在medium上阅读Clio的介绍,访问我们的GitHub仓库或网站,或者你可以直接进入我们的游乐场,看看并尝试一些例子。

不过,让我向你展示一下Clio的快速演示,以及如何用它进行多线程。要在浏览器或Node.js上实现多线程,你所需要做的就是定义你的函数并使用|sandwich|语法来调用它们,Clio会处理剩下的事情。

文章图片2

用Clio编写的Fib函数

如果你愿意,你可以直接在Playground上运行这个例子。

在这个例子中,有一些小细节需要解释。在上面示例代码的第8行,你可以看到Clio的三明治语法|fib|的演示,它在一个单独的线程中运行fib函数。在同一行,你可以看到-> *被用来将数据映射到|fib|函数。在第9行,(console.log @it)是一个匿名函数,接受它作为第一个参数。

通过Clio,还可以通过网络导入函数,并像其他常规函数一样使用它们。有了Clio,你不需要制作和实现API端点,只需托管你的函数并将其导入其他地方,Clio免费为你提供FaaS和微服务架构,没有任何额外的麻烦。比如说

文章图片3

是有效的Clio代码。要看远程功能的演示,你可以在这里查看我们的todo例子。

最近刚刚发布的Clio v0.11.0版本带来了一些重要的变化。这些变化主要与性能有关:它们提高了Clio代码的执行速度,同时也提高了整体的RPC和多线程性能。在这篇文章中,我将向你展示Clio到底有多快,我们将一起去看看这些新的增强功能。让我们从性能开始!

Clio的速度有多快?

由于Clio编译为JavaScript,每个人的第一个假设是Clio比较慢,或者和JavaScript一样慢。对于TypeScript这样的语言来说,这可能是真的,但Clio实际上比JavaScript快,在某些情况下,它比JavaScript快得多。我将在文章的后面解释Clio如何实现这样的性能。但现在,让我们来看看我们正在谈论的速度有多快。

文章图片4

Clio的性能与其他语言相比

上图显示了用不同编程语言计算第1000个斐波那契数的执行时间。当然,我并不期望Clio总是或在其他任何情况下都这么快,我也不主张Clio和C一样快,我主张的是Clio超级快,而且在使其快速方面做了大量的工作。那么,如果它编译成JavaScript,怎么会这么快呢?

首先,我应该提到,与一般人的想法相反,JavaScript实际上是一种非常快的编程语言。由于Clio编译为JavaScript,编译器可以对生成的JavaScript应用编译时优化。在上面的例子中,尾部调用优化被应用于Fibonacci函数。你可以在这里找到该基准的源代码。

Clio运行速度比JavaScript快的另一个原因是Clio代码的编写方式:使用管道,可以避免创建中间的常量或变量。一个函数调用的输出可以直接通过管道进入另一个函数,再从那里进入另一个。当然,也可以在JavaScript中嵌套函数调用,避免产生中间变量,然而,Clio的语法是精心设计的,允许这样做,同时保持可读性。例如,下面的JavaScript代码。

文章图片5

在Clio中变成了这样。

文章图片6

在上面的JavaScript例子中,函数的执行顺序是从内到外,但在Clio代码中,它从左到右被执行,与你读和写代码的顺序完全一致。如果你仔细想想,这就更有意义了!

为了保持Clio的快速性,我们花了很多时间和精力,为此我们不得不牺牲了不少功能。举个例子,我们不得不放弃懒惰,因为我们运行的V8引擎并不原生支持它。然而,我们确保Clio兼容保持JavaScript。

因此,你现在可以将任何JavaScript库导入Clio并使用它,而不会面临任何问题。因此,你甚至可以受益于Clio的多线程功能,使你的JavaScript库运行更快。

文章图片7

在上面的图表中,你可以看到用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的本地序列化库的性能

文章图片8

Clio Mandelbrot的例子

Sia是一种二进制序列化格式,正如你在上图中看到的,Sia的速度非常快如果想看更多的基准,或者想了解更多关于Sia以及它是如何做到如此之快的,你可以参考这篇媒介文章。使用Sia作为一个序列化库,Clio在多线程、其远程函数调用和RPC协议上获得了很大的性能提升。

文章图片9

上图显示了我切换到Sia后Clio的性能提升。不仅是序列化数据的速度更快,现在传输数据的速度也更快。有了Sia,序列化的数据比JSON小得多,而且已经是二进制格式了!在浏览器上,性能也大大提升。在浏览器上,性能也得到了极大的改善。对于一个快速的演示,你可以查看下面的视频,看看Clio Mandelbrot的例子在Sia上的渲染速度与JSON相比有多快。

视频显示了用Clio编写的多线程曼德布罗特例子的渲染时间。你可以在这里查看它的运行情况,或者你可以在GitHub上查看源代码。正如你所看到的,Sia版本比JSON版本快得多,完成的时间几乎是JSON版本的一半

使用Clio,在一个线程中运行函数是超级简单的,不需要自己设置任何东西,不需要处理网络工作者或工作者线程,不需要实现通信协议或同步,一切都已经处理好了,只要运行clio new来构建一个新的项目,编写你的代码,然后运行clio run命令,你就可以在几秒钟内启动和运行你的应用程序。你可以在Clio的例子库中查看例子。

Clio仍然是一种非常年轻的语言,它还有很长的路要走,它还不适合生产,我也不急于稳定发布。我想保持它的最小化,我想仔细选择哪些东西可以进入,哪些东西我们应该保留在语言之外。它的设计考虑到了云和微服务,这也是主要焦点所在。对于Clio,我的目标是一种在网络上和网络外都可以使用的通用语言,一种适合制作网站的语言,也适合计算数字和科学数据。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多