В последнее десятилетие Ruby стал широко используемым языком, в основном из-за его удобочитаемости и динамических функций. Crystal - это относительно новый язык программирования - его первая фиксация датируется сентябрем 2012 г. - он имеет очень интересную предпосылку: синтаксис, подобный Ruby, с преимуществами языка со статической типизацией.

Отказавшись от некоторых динамических функций Ruby, Crystal стремится стать языком, дружественным к программистам и имеющим статическую типизацию, поскольку вам не нужно указывать типы переменных или аргументы методов (в отличие от Java, где это сложно и многословно). по системе типов.

Этот пост предназначен для того, чтобы сделать простую отметку между очень похожими приложениями для сравнения повышения производительности. Пример приложения, которое будет использоваться в этом тесте, будет отображать только «Hello world!» объединены с именем, переданным в URL-адресе.

Рубиновая версия (Синатра)

Версия Ruby использует Sinatra, простой и очень известный веб-фреймворк, почти канонический выбор для таких простых вещей, как эта.

И результат:

> wrk -t12 -c400 -d30s http://localhost:4567/hugo
Running 30s test @ http://localhost:4567/hugo
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   144.48ms   72.67ms   1.01s    90.22%
    Req/Sec   189.67     88.74   343.00     78.26%
  20716 requests in 30.10s, 5.94MB read
Requests/sec:    688.30
Transfer/sec:    201.98KB

Кристальная версия (Фрэнк)

В версии Crystal используется Frank, клон Sinatra, созданный в качестве доказательства концепции, поэтому код очень близок к тому, что используется в версии Ruby, но требует откровенного текста вместо sinatra и некоторых небольших изменений.

И запускаем тест:

> wrk -t12 -c400 -d30s http://localhost:3000/hugo
Running 30s test @ http://localhost:3000/hugo
  12 threads and 400 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    32.71us   90.09us   9.60ms   99.77%
    Req/Sec    29.95k     3.47k   31.96k    98.68%
  906947 requests in 30.07s, 92.55MB read
  Socket errors: connect 0, read 0, write 0, timeout 1
Requests/sec:  30164.64
Transfer/sec:      3.08MB

С помощью этого теста мы можем увидеть очень значительное улучшение времени отклика. Но есть некоторые моменты, о которых следует помнить. Это не настоящее приложение, это небольшой пример. Более точный тест, например, установит некоторые соединения с базой данных и отобразит страницы с результатом. Однако Фрэнк мог быть почти в 50 раз быстрее Синатры, что должно вызвать некоторый интерес.

Crystal - новый язык, его сообщество все еще растет и развивает экосистему, у него нет такого убийственного приложения, как Rails to Ruby, но за ним нужно следить.