В последнее время появилось много довольно симпатичных веб фраймворков для Go. Сегодня решил потыкать несколько из них. Ну и сделать небольшой бенчмарк как водится в таких случаях.
Все фраймворки тестировались на одном и том же железе - полудохлом макбуке бородатых годов и компилировались с помощью go1.2.1 darwin/amd64. Дабы избежать холиваров сразу скажу:
- Да, я знаю что бенчмарки Hello word и реального приложения имеют мало общего и я не собираюсь их сравнивать между собой
- Ежу понятно что приложение на чистом net/http будет быстрее. Цель данного исследования - узнать ту "цену" которую нам приходится платить за удобство использования того или иного фраймворка.
Для тестирования мы используем siege (конкретно siege -c 100 -b -r 100 ).
И так, Hello world на чистом net/http (исходники доступны на тут ):
Transactions: 10000 hits
Availability: 100.00 %
Elapsed time: 4.62 secs
Data transferred: 0.10 MB
Response time: 0.04 secs
Transaction rate: 2164.50 trans/sec
Throughput: 0.02 MB/sec
Concurrency: 77.89
Successful transactions: 10000
Failed transactions: 0
Longest transaction: 0.14
Shortest transaction: 0.00
Transactions: 10000 hits
Availability: 100.00 %
Elapsed time: 6.87 secs
Data transferred: 0.11 MB
Response time: 0.06 secs
Transaction rate: 1455.60 trans/sec
Throughput: 0.02 MB/sec
Concurrency: 94.52
Successful transactions: 10000
Failed transactions: 0
Longest transaction: 0.42
Shortest transaction: 0.00
Эти результаты наглядно показывают что за все нужно платить. Даже даже не самый сложный фраймворк отъедает значительное количество ресурсов. Transactions: 10000 hits
Availability: 100.00 %
Elapsed time: 4.71 secs
Data transferred: 0.10 MB
Response time: 0.04 secs
Transaction rate: 2123.14 trans/sec
Throughput: 0.02 MB/sec
Concurrency: 78.24
Successful transactions: 10000
Failed transactions: 0
Longest transaction: 0.33
Shortest transaction: 0.00
Исходники можно посмтреть тут. Я специально не стал убирать middleware's чтобы тесты между gocraft и martini были максимально честными. Как вы видите показатели практически идентичны чистому net/http. И значительно быстрее martini. Хотя влияние Martini четко просматривается.
Следующим подопытным будет revel. По предоставляемым возможностям это фреймворк совсем другого уровня, и сравнивать его с предыдущими кандидатами будет не совсем корректно. Это видно даже по "hello word". Если у martini и gocraft это просто 10 строк исходного кода, то для revel - это целое приложение с MVC структурой и кучей всяких файлов. Одно хорошо - все эти файлы генерируются автоматически и мы с помощью одной команды: revel new myapp получаем готовое приложение. А теперь результаты:
Transactions: 9872 hits
Availability: 98.72 %
Elapsed time: 34.14 secs
Data transferred: 19.24 MB
Response time: 0.22 secs
Transaction rate: 289.16 trans/sec
Throughput: 0.56 MB/sec
Concurrency: 64.71
Successful transactions: 9872
Failed transactions: 128
Longest transaction: 20.17
Shortest transaction: 0.00
Сказать что результаты меня разочаровали - значит ничего не сказать. В принципе на PHP +Yii мы получаем тоже самое без всяких оптимизаций. Плюс к тому Availability не 100%... и это у Hello world... В общем revel меня разочаровал. В консоли он ругался что-то вроде: 2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
2014/05/11 16:37:22 server.go:1633: http: Accept error: accept tcp [::]:9000: too many open files; retrying in 5ms
2014/05/11 16:37:22 reverseproxy.go:141: http: proxy error: dial tcp 127.0.0.1:62188: too many open files
зачем создателю revel понадобился reverse proxy - ума не приложу.Последний кандидат на сегодня - beego. По своему уровню он очень похож на revel - он также гененирует целое приложение с кучей папочек. Но результаты у него куда лучше:
Transactions: 10000 hits
Availability: 100.00 %
Elapsed time: 20.27 secs
Data transferred: 15.19 MB
Response time: 0.18 secs
Transaction rate: 493.34 trans/sec
Throughput: 0.75 MB/sec
Concurrency: 90.49
Successful transactions: 10000
Failed transactions: 0
Longest transaction: 0.71
Shortest transaction: 0.00
Response time в 5 раз выше чем у gocraft, но это объяснимо. В общем мой выбор это beego и gocraft. В зависимости от характера приложния.
Комментариев нет:
Отправить комментарий