#benchmark #benchmarks #performance #web-frameworks
|
12 years ago | |
---|---|---|
HttpListener | 12 years ago | |
aspnet | 12 years ago | |
aspnet-stripped | 12 years ago | |
beego | 12 years ago | |
bottle | 12 years ago | |
cake | 12 years ago | |
compojure | 12 years ago | |
config | 12 years ago | |
cowboy | 12 years ago | |
cpoll_cppsp | 12 years ago | |
dancer | 12 years ago | |
dart | 12 years ago | |
dart-start | 12 years ago | |
dart-stream | 12 years ago | |
django | 12 years ago | |
django-stripped | 12 years ago | |
dropwizard | 12 years ago | |
elli | 12 years ago | |
express | 12 years ago | |
falcon | 12 years ago | |
falcore | 12 years ago | |
finagle | 12 years ago | |
flask | 12 years ago | |
gemini | 12 years ago | |
go | 12 years ago | |
grails | 12 years ago | |
grizzly-bm | 12 years ago | |
grizzly-jersey | 12 years ago | |
hapi | 12 years ago | |
http-kit | 12 years ago | |
jester | 12 years ago | |
kelp | 12 years ago | |
lapis | 12 years ago | |
lift-stateless | 12 years ago | |
luminus | 12 years ago | |
mojolicious | 12 years ago | |
nancy | 12 years ago | |
netty | 12 years ago | |
nodejs | 12 years ago | |
onion | 12 years ago | |
openresty | 12 years ago | |
php | 12 years ago | |
php-codeigniter | 12 years ago | |
php-fuel | 12 years ago | |
php-kohana | 12 years ago | |
php-laravel | 12 years ago | |
php-lithium | 12 years ago | |
php-micromvc | 12 years ago | |
php-phalcon | 12 years ago | |
php-phalcon-micro | 12 years ago | |
php-phpixie | 12 years ago | |
php-silex | 12 years ago | |
php-silex-orm | 12 years ago | |
php-silica | 12 years ago | |
php-slim | 12 years ago | |
php-symfony2 | 12 years ago | |
php-yaf | 12 years ago | |
phreeze | 12 years ago | |
plack | 12 years ago | |
plain | 12 years ago | |
play-java | 12 years ago | |
play-java-jpa | 12 years ago | |
play-scala | 12 years ago | |
play-scala-mongodb | 12 years ago | |
play-slick | 12 years ago | |
play1 | 12 years ago | |
play1siena | 12 years ago | |
rack | 12 years ago | |
racket-ws | 12 years ago | |
rails | 12 years ago | |
rails-stripped | 12 years ago | |
restexpress | 12 years ago | |
results | 12 years ago | |
revel | 12 years ago | |
revel-jet | 12 years ago | |
revel-qbs | 12 years ago | |
ringojs | 12 years ago | |
ringojs-convenient | 12 years ago | |
sbt | 12 years ago | |
scalatra | 12 years ago | |
servicestack | 12 years ago | |
servlet | 12 years ago | |
sinatra | 12 years ago | |
snap | 12 years ago | |
spark | 12 years ago | |
spray | 12 years ago | |
spring | 12 years ago | |
tapestry | 12 years ago | |
toolset | 12 years ago | |
tornado | 12 years ago | |
treefrog | 12 years ago | |
undertow | 12 years ago | |
unfiltered | 12 years ago | |
uwsgi | 12 years ago | |
vertx | 12 years ago | |
wai | 12 years ago | |
web-simple | 12 years ago | |
webgo | 12 years ago | |
wicket | 12 years ago | |
wsgi | 12 years ago | |
yesod | 12 years ago | |
.gitignore | 12 years ago | |
LICENSE | 12 years ago | |
README.md | 12 years ago |
This project provides representative performance measures across a wide field of web application frameworks. With much help from the community, coverage is quite broad and we are happy to broaden it further with contributions. The project presently includes frameworks on many languages including Go, Python, Java, Ruby, PHP, Clojure, Groovy, JavaScript, Erlang, Haskell, Scala, Lua, and C. The current tests exercise plaintext responses, JSON seralization, database reads and writes via the object-relational mapper (ORM), collections, sorting, server-side templates, and XSS counter-measures. Future tests will exercise other components and greater computation.
Read more and see the results of our tests on Amazon EC2 and physical hardware at http://www.techempower.com/benchmarks/
Join in the conversation at our Google Group: https://groups.google.com/forum/?fromgroups=#!forum/framework-benchmarks
We ran our tests using two dedicated i7 2600k machines as well as two EC2 m1.large instances.
On the Benchmark Tools README file you will find tools and instructions to replicate our tests using EC2, Windows Azure or your own dedicated machines.
We hope that the community will help us in making these tests better, so if you'd like to make any changes to the tests we currently have, here are some things to keep in mind.
If you're updating a dependency of a framework that uses a dependency management system (Bundler, npm, etc.), please be specific with the version number that you are updating to.
Also, if you do change the dependency of any test, please update the README file for that test to reflect that change, we want to try and keep the README files as up to date as possible.
If you would like to update any of the software used, again, please be as specific as possible, while we still install some software via apt-get and don't specify a version, we would like to have as much control over the versions as possible.
The main file that installs all the software is in toolset/setup/linux/installer.py
. It's broken up into two sections, server software and client software.
Additionally, it may be necessary to update the setup.py file in the framework's directory to use this new version.
If you update any software, please update the README files of any tests that use that software.
When adding a new framework or new test to an existing framework, please follow these steps:
There are three different tests that we currently run:
The single query database test can be treated as a special case of the multiple query test with the query-count parameter set to 1.
This test needs to follow the following conventions:
Pseudo-code:
obj = { message : "Hello, World!" }
render json.encode(obj)
This test will:
By convention, if the test does not use an ORM, and instead uses the raw database connectivity provided by the platform (e.g., JDBC), we append a "-raw" to the test name in the benchmark_config file. For example, "php-raw".
Pseudo-code:
random_id = random(1, 10000)
world = World.find(random_id)
render json.encode(world)
This test is very similar to the single query test, and in some cases it will be implemented using the same code. A URL parameter is made available to specify the number of queries to run per request. The response is a list of objects resulting from the queries for random rows.
Pseudo-code:
number_of_queries = get("queries")
worlds = []
for i = 0; i < number_of_queries; i++
random_id = random(1, 10000)
worlds[i] = World.find(random_id)
render json.encode(worlds)
The benchmark_config file is used by our run script to identify the available tests to be run. This file should exist at the root of the test directory. Here is its basic structure:
{
"framework": "my-framework",
"tests": [{
"default": {
"setup_file": "setup.py"
"json_url": "/json",
"db_url": "/db",
"query_url": "/db?queries=",
"port": 8080,
"sort": 32
}, {
"alternative": {
"setup_file": "alternate_setup.py"
"json_url": "/json",
"db_url": "/db",
"query_url": "/db?queries=",
"port": 8080,
"sort": 33
}
}]
}
The setup file is responsible for starting and stopping the test. This script is responsible for (among other things):
The setup file is a python file that contains a start() and a stop() function. Here is an example of Wicket's setup file.
import subprocess
import sys
import setup_util
##################################################
# start(args)
#
# Starts the server for Wicket
# returns 0 if everything completes, 1 otherwise
##################################################
def start(args):
# setting the database url
setup_util.replace_text("wicket/src/main/webapp/WEB-INF/resin-web.xml", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
# 1. Compile and package
# 2. Clean out possible old tests
# 3. Copy package to Resin's webapp directory
# 4. Start resin
try:
subprocess.check_call("mvn clean compile war:war", shell=True, cwd="wicket")
subprocess.check_call("rm -rf $RESIN_HOME/webapps/*", shell=True)
subprocess.check_call("cp wicket/target/hellowicket-1.0-SNAPSHOT.war $RESIN_HOME/webapps/wicket.war", shell=True)
subprocess.check_call("$RESIN_HOME/bin/resinctl start", shell=True)
return 0
except subprocess.CalledProcessError:
return 1
##################################################
# stop()
#
# Stops the server for Wicket
# returns 0 if everything completes, 1 otherwise
##################################################
def stop():
try:
subprocess.check_call("$RESIN_HOME/bin/resinctl shutdown", shell=True)
return 0
except subprocess.CalledProcessError:
return 1