红宝石与水晶性能对比

2020-06-06 03:06:12

在过去的几年里,我到处听到关于Crystal编程语言的消息,但直到昨天才有机会去看一看。

什么是水晶?它是一种静态类型的、编译的、面向对象的语言,其语法深受Ruby的启发。

其网站上的承诺是,该语言像C一样快,像Ruby一样流畅。这句话听起来令人兴奋,让您想看看Crystal与Ruby相比有多快。当然,这不是一个公平的比较,因为一个是编译语言,另一个是解释语言(下面使用的Ruby MRI实现)。

从Crystal的网站上摘取的一个基本HTTP服务器的实现按预期工作,代码看起来确实像Ruby的:

要求";http/server";server=HTTP::server。新建DO|Context|Context。回应。content_type=";文本/纯文本";上下文。回应。打印";Hello world,获得#{上下文。请求。PATH}!";END PUT";侦听http://127.0.0.1:8080";服务器。聆听(8080)。

让我们用Ruby和Crystal编写一些代码,为给定的数字生成斐波纳契数列。然后,我们可以查看查找序列中第46个数字(即1,836,311,903)所需的时间。稍后你就会明白我为什么选这个号码了。

如果我们试图找到斐波纳契序列中的下一个,第47个数字,Crystal实际上会给我们一个错误:

未经处理的异常:Fibonacci中的Fibonacci中的算术溢出(OverflowError)。cr:6:6 in';__Crystal_Main';中的/usr/local/Cellar/crystal/0.34.0/src/crystal/main.cr:105:5 in';Main';

如果您还记得Crystal是一种静态类型的语言,但是您可以省略显式类型限制,编译器会尝试推断变量的类型。在我们的代码中,Crystal对n变量使用Int32类型,它的最大值为2,147,483,647,但是第47个数字更高。在本例中,我们需要指定n的类型。我们可以使用无符号整数64。

我们可以优化代码并引入记忆化,以返回先前计算的数字的缓存结果。

def Fibonacci(n,cache=[0,1])如果cache[n]cache[n]=Fibonacci(n-1,cache)+Fibonacci(n-2,cache)end放入斐波纳契数(100),则返回cache[n]。

def fibonacci(n,cache=[0,1]of UInt128)如果cache[n]?(cache<;<;<;fibonacci(n-1,cache)+Fibonacci(n-2,cache))[-1]end放置斐波纳奇数(100),则返回cache[n]。

当我们尝试寻找斐波纳契序列中相当大的第100个数字时:354,224,848,179,261,915,075,结果如下:

这表明,必须首先优化的是算法,而不是选择一种速度更快的语言或机器。

水晶碎片数据库-就像水晶的Ruby工具箱