我想这一次将是一个公平的性能比较,因为这两种语言都是编译和静态类型的。
我很想知道围棋和克里斯托的表现如何比较。
对于测试,我们将运行以前编译的程序。我们将使用发布标志在Crystal中启用优化:
Go二进制文件没有发布版本,我们也不会使用任何标志。所以,它只是:
好的,首先我们将编写代码来生成给定数字的斐波纳契数列。让我们找出第47个数字,它是2,971,215,073。
软件包main import";fmt";func Fibonacci(N Uint32)uint32{if n<;2{return n}return Fibonacci(n-1)+Fibonacci(n-2)}func main(){fmt。Println(费波纳奇(47))}。
如果n<;2 Fibonacci(n-1)+Fibonacci(n-2)end放入Fibonacci(47),则def Fibonacci(n:UInt32)返回n。
Crystal的二进制大小是Go的5倍,不过,如果我们省略调试信息,它们的大小可以略微减小:
此外,不是在这个特定的示例中,但通常Go的编译时间比Crystal快得多。
现在,让我们使用标准库创建一个简单的HTTP服务器。Go的net/http和Crystal的http/server都使用并发:Go使用goroutine,Crystal使用纤程。
包主要导入(";fmt";";net/http&34;)func main(){http.。HandleFunc(";/";,HelloServer)http。ListenAndServe(";:8080";,nil)}func HelloServer(带http。ResponseWriter,r*http。请求){fmt。Fprintf(w,&34;Hello from%s!";,r.。URL。路径[1:])}。
要求";http/server";server=HTTP::server。新建DO|Context|Context。回应。content_type=";文本/纯文本";上下文。回应。从#{context打印";Hello。请求。PATH}!";END PUT";侦听http://127.0.0.1:8080";服务器。聆听(8080)。
对于基准测试,我们将使用WRK。如果您不熟悉这个工具,它就像一个非常有名的ApacheBench(Ab),但它是一个现代版本。
下面是我们如何运行基准测试60秒,使用8个线程,并保持400个HTTP连接打开:
运行1M测试@http://localhost:8080/hello 8线程和400个连接线程统计平均标准开发V最大+/-标准开发延迟3.56ms 2.26ms 95.31ms 92.00%Req/Seq 8.77k 2.24k 15.75k 64.66%1.00M中的4190457个请求,535.51MB读套接字错误:CONNECT157,READ 100,WRITE 0,TIMEOUT 0请求/秒:69757.81传输/秒:8.91MB。
运行1M测试@http://localhost:8080/hello 8线程和400个连接线程统计平均标准开发V最大+/-标准开发延迟2.89ms 0.97ms 19.01ms 80.34%Req/Seq 10.54k 3.41k 18.14k 60.85%1.00M中的5035284个请求,513.82MB读套接字错误:CONNECT157,READ 85,WRITE 0,TIMEOUT 0请求/秒:83917.26传输/秒:8.56MB
表中超过100%的CPU利用率可能看起来令人困惑。但这仅仅意味着系统使用多个内核。最大一个核心是100%。
我的机器有8个内核,可以在MacOS上使用以下命令看到:
坦率地说,我们只做了几次小测试来得出任何结论,但我仍然为Crystal作为一种年轻的语言而感到兴奋,但显示出了很好的结果。