U.S. Supreme Court rejects Amazon warehouse worker wage appeal - <AUTHOR> https://www.reuters.com/article/us-usa-court-amazon-com/u-s-supreme-court-rejects-amazon-warehouse-worker-wage-appeal-idUSKBN1WM1FI <comment><USER2> It seems eminently reasonable and obvious that workers should be compensated for performing the Duties of their job while at work or in premises. Clearly submitting to a security check before being allowed to leave work is an obligation they incur as an employee.

They should not be able to "clock out" until after such security checks.

<comment><USER3> Amazon gets all the attention because it's Amazon. Work a retail job anywhere and you will discover that MILLIONS of retail workers must do similar checks.

<comment><USER4> 1\. They should get paid for that time, too.

2\. The article says "the screening takes around 25 minutes to complete", which is _not_ typical in retail.

<comment><USER5> Grossly inaccurate is the best way of describing the screening time, I've done the amazon fulfillment center tour and seen employees check in for different shifts, it does not take 25 minutes to go through the screening process. There's no way Amazon with its efficiency mantra would let this happen knowing how it eventually impacts the bottom line.

<comment><USER6> > Grossly inaccurate is the best way of describing the screening time

Amazon agrees with you... they contend that the screening doesn't actually take this long. I'm not clear on how a question of fact like this can be in dispute unless we are arguing over definitions.

> I've done the amazon fulfillment center tour and seen employees check in for > different shifts, it does not take 25 minutes to go through the screening > process.

No one is claiming that the check-in process takes a long time. The check-out process is the one where the employees are screened for theft, and that is where the employees claim they must wait (unpaid) for a long time.

> There's no way Amazon with its efficiency mantra would let this happen > knowing how it eventually impacts the bottom line.

I find that completely unpersuasive. The courts have just told Amazon that they DON'T HAVE TO PAY for this time. So it isn't inefficient for them to allow it to take lots of time. It doesn't affect Amazon's bottom line until the point where it becomes difficult for Amazon to hire any workers.

<comment><USER7> > I find that completely unpersuasive. The courts have just told Amazon that > they DON'T HAVE TO PAY for this time.

The headline is a little misleading. The appellate court was letting the case vs. Amazon go to trial under state labor law; the Supreme Court decided not to intervene, so the dispute is still being litigated.

(Previously, the Supreme Court said time being screening doesn't require compensation under _Federal_ law).

</comment></comment></comment></comment></comment></comment><comment><USER8> Ok, so the key ruling here was in 2014, which said "the Supreme Court declared that such screening procedures were not an 'integral' part of the job. Integrity's staff at the warehouses...were hired to take products off the shelves and package them for shipment to Amazon's customers, not to go through security screenings. The Court also found that Integrity could have eliminated the screenings without affecting the workers' ability to complete their normal tasks." [0]

So it seems like if the security isn't integral to the job, then someone should be able to just walk out without doing the screening. Then of course they would get fired for that, and could then sue that they got fired despite the fact that the screening isn't integral to their job duties. The company would either have to claim that the security is integral, or allow others to skip it too.

Now of course, a warehouse worker doesn't have the resources to engage in such a lawsuit or live without a job while it plays out, which is what Amazon counts on here. But what if someone agreed to pay all the legal fees and pay the employee an equivalent wage to be a test case?

[0] [https://www.scotusblog.com/2014/12/no-overtime-pay-for- after...](https://www.scotusblog.com/2014/12/no-overtime-pay-for-after-work- security-check/)

<comment><USER9> The Court was looking at whether screenings violated the Fair Labor Standards Act, and specifically at 245 of the Portal-to-Portal Act, which restricted the requirement to pay for pre/post work activity. I get two parts of the rationale, and it's bizarre, but I'm pretty sure the result is that even if Integrity fires you for not doing it, the work still doesn't have to be paid.

First, the Court found that performing screenings is not what employees are hired to do: they're not the point of the job, just a condition of employment. This is fairly obvious, but necessary to establish because someone who _was_ paid to do screenings (e.g. as a physical security pen-tester) would obviously need to be paid for that.

Second, it found that those screenings are not "integral" to the job. This sounds odd for a required screening, but the context is specifically about the _work_ of the job and not the terms of employment. Pre/post work like donning safety gear or a toolbelt is (legally or practically) necessary to complete the work, so past cases have found that it's effectively part of the labor and must be paid. This is also the context of the final holding: if Integrity could eliminate the screenings without affecting the workers' ability to pick and package goods, they must not be an intrinsic aspect of the job.

The Portal to Portal Act says that any labor which benefits the employer must be paid, while generally asserting that other pre/post work does not need to be paid, with commuting as a specific example of necessary-but-unpaid time. So "you'll get fired if you don't do it" isn't actually enough to qualify.

Perversely, the result of the act is that employers _can 't_ require unpaid, necessary tasks, but _can_ require unpaid, _unnecessary_ tasks. On one level, this makes sense: if putting on a toolbelt, wetsuit, or whatever else is necessary for the work, every employer will require it and failing to pay for that time is clearly harmful. But if an employer makes you recite a corporate chant before starting work, you can quit and go somewhere else. On another level, the contract system seriously distorts the logic: you can only be employed at that Amazon warehouse by fulfilling this restriction.

Ultimately, though, the court doesn't care about that. Congress passed a law which effectively says useless work time doesn't need to be paid, so this practice is legal. Which I believe holds all the way through the absurd case: if these screenings took 80 hours a week, they'd still be legal to not pay.

</comment></comment><comment><USER10> So, trying to follow the sequence of thrown out and overturned, it seems like now it would be going all the way back down to the original court that threw out the lawsuit to go forward? Seems crazy that it's taking this long to settle the question.

Tangentially it seems crazy they're not required to pay for the time spent going through security. If they're paid hourly and not free to go they're still on the job.

<comment><USER11> Yes. The Supreme Court rejected a claim in 2014 under federal law. Plaintiffs replead claims under state law. While a district court found the claims barred by state law as well, the Sixth Circuit found the claim were not. The Supreme Court declined to review the Sixth Circuit's ruling, meaning the case can go forward under the Sixth Circuit's decision.

The Supreme Court (and appellate courts) are a batch system, with high throughout but poor latency. The Supreme Court reviews 7,000-8,000 petitions for certiorari each year, rendering judgment in the merits after oral argument on about 80-100 cases per year. Each case typically has hundreds of pages of briefing, rulings below, etc., and requires reference to hundreds of additional pages of precedent and other authorities. All that is done by the nine justices, each with the assistance of four clerks.

<comment><USER12> If I understand your comment (which is much clearer than the article) the 2014 US Supreme Court decision with respect to the 1947 Act is still valid Federal. The 6th Circuit ruled that the US Supreme Court decision and the 1947 Act do not preclude lawsuits on the state level. That makes more sense, because it seemed odd that if the 6th Circuit disagreed with a 2014 Supreme Court ruling, they would hear it.

<comment><USER13> Amazon's argument wasn't that the FLSA prohibited state suits; it was about interpretation of Nevada state law. Specifically, Nevada had defined "work" to be "whatever the definition of work is under the federal FLSA". The appeals court ruled that, since the FLSA said the security checks exception was specifically an exception, it was still legally defined as work, and Nevada had not adopted the federal exceptions.

<comment><USER12> Lawyer is a weird job.

<comment><USER13> There's a reason tabletop gamers call it "rules lawyering".

</comment></comment></comment></comment></comment></comment><comment><USER14> Is it not crazy that is has to come down to a Supreme Court case for Jeff Bezos and Amazon to treat their employees fairly?

This isn't a company that's on a sink or swim margin where this will collapse the company. Not when they're fine stocking all the break rooms in corporate offices with starbucks and AWS people get shelves full snacks all day. But give an hourly employee a little more money to accommodate their self enforced security is a line too far.

If you're an Amazon corporate employee, you support these decisions by working there.

<comment> jon-wood I disagree with this decision, but Amazon are fairly well known for being one of the few big tech startups that don't have fully stocked snack supplies on every floor, and expecting staff to pay for those out of their own pocket. In all the Amazon offices I've gone to the only thing being given out for free is borderline acceptable coffee, hot water, tea bags, and milk.

<comment><USER15> Some have a bit more than the basics you describe but generally you are correct.

</comment></comment></comment><comment><USER16> The Supreme Court decision related to this is being unfairly maligned in these comments, even though I'm in total agreement that the end result was bad.

I recommend reading the ruling [0] itself; it's readable and quite short, under 2,500 words.

The unanimous 2014 decision concluded that Amazon (technically, a contractor) could not be penalized under federal law for not paying workers for time spent getting through security screenings. It turned on the 1947 Portal-to-Portal Act. IANAL, but, looking at the decision, I don't see how they could have reasonably ruled any other way.

To summarize:

In the 1940s, courts had interpreted the Fair Labor Standards Act (source of the minimum wage, overtime pay, etc.) to imply very broad definitions of "work" and "workweek". This allowed mine workers to sue for back pay for all the time they spent traveling between mine portals and work areas. This wasn't consistent with pre-FLSA practice, and companies suddenly faced huge, unexpected lawsuits for back pay and damages. Congress passed the Portal-to- Portal Act explicitly to clarify the definition of time "on the clock" and prevent these lawsuits, excluding "preliminary" and "postliminary" activities.

It is this law that results in Amazon not having to pay their workers for the screenings. Quoting from Sotomayor's concurrence:

      The security screenings at issue here fall on the
      "preliminary . . . or postliminary" side of this line.
      (*citation*) The searches were part of the process by
      which the employees egressed their place of work, akin
      to checking in and out and waiting in line to do so
      activities that Congress clearly deemed to be
      preliminary or postlimininary. See (*citation*).
      Indeed, as the Court observes, the Department of Labor
      reached the very same conclusion regarding similar
      security screenings shortly after the Portal-to-Portal
      Act was adopted

So, I believe that, obviously, Amazon should have to pay workers for these hours. But the blame for their not having to do so lies with the federal government's inability to update a 1947 law rather than with the courts.

<comment><USER17> Thanks for the accurate breakdown of this. People should not be relying on the courts to make law. If people are upset with the law being wrong then the law needs to be fixed through the legislature (Congress, or alliteratively States' Congresses)

<comment><USER16> I get why people do rely on the courts, though. Our lawmaking process is horribly broken. Major legislation doesn't get passed because it requires overwhelming control of Congress and the Whitehouse. Constitutional amendments are all but impossible when it's unlikely to get 34 state legislatures to agree on which way is North. The judiciary and executive action are the only ways left to make anything actually happen.

</comment></comment></comment><comment><USER18> "A judge there dismissed the case, citing the 2014 Supreme Court ruling, since Nevada wage laws track their federal counterparts. The Cincinnati, Ohio-based 6th U.S. Circuit Court of Appeals in 2018 overturned that decision."

So, if the appeals court overturned the dismissal, wouldn't the appeal the Supreme Court denied be to uphold it, meaning that the case should be moving forward? Such a badly worded article.

<comment><USER19> Agreed. The title - "rejects Amazon warehouse worker wage appeal" doesn't even make it clear which side filed the appeal which was rejected.

</comment></comment><comment><USER20> It seems crazy that our worker laws are so degraded by corporate interests that the worker can be compelled to do a task without pay.

Fortunately Nevada is taking a stand against slavery that the US Supreme Court refused to do in 2014.

</comment><comment><USER21> Slightly better worded article:

Amazon Rejected by U.S. Supreme Court on Pay Claims by Workers

[https://www.bloomberg.com/news/articles/2019-10-07/amazon- re...](https://www.bloomberg.com/news/articles/2019-10-07/amazon-rejected-by- u-s-supreme-court-on-pay-claims-by-workers)

</comment><comment><USER22> If Amazon is paying people minimum wage, then it could be argued that the extra 30 minutes would push them over the edge of minimum wage laws.

However, from what I recall of Amazon's announcement this year, they pay all warehouse workers at least $15/hr. This means they are significantly above the minimum wage requirement, even if you factor in the 30 minutes spent in security screenings.

In an ideal world, Amazon would factor in the time spent in security screenings, when advertising the job's hourly rate. Ie, workers are spending 5% of their time in security screenings, so the advertised hourly rate should be 5% lower than $15/hr. I would also like for all food-prices in restaurants to factor in taxes for the same reason, but I've thrown the towel on that fight. Ultimately, this seems like a purely cosmetic change with little substance behind it.

</comment><comment><USER23> I guess I can't read English anymore. The headline to me reads that the WORKERS appeal was rejected, but it's a ruling FOR the workers, rejecting AMAZON's appeal.

<comment><USER24> Key paragraph:

 _The U.S. Supreme Court on Monday declined to hear Amazon.com's bid to avoid a lawsuit seeking to ensure that warehouse workers ... get paid for the time it takes them to go through extensive post-shift security screenings._

</comment></comment><comment><USER25> It sounds like the post-shift screening shouldn't be necessary. If they're not paying you, you should be free to go. The worker should try opting-out of the screening: it should be an OSHA issue if you can't freely leave the building at anytime.

<comment><USER26> "Sure you are free to go. And don't bother showing up tomorrow."

<comment><USER25> If everyone started refusing, they might be willing to change policy. That much overturn at once could be problematic.

<comment><USER26> All workers banding together and presenting a united front? Sounds familiar..

</comment></comment></comment></comment><comment><USER27> Bear in mind the base rate of acceptance is single-digit percent low: [https://supremecourtpress.com/chance_of_success.html](https://supremecourtpress.com/chance_of_success.html)

</comment><comment><USER28> So according to this, as of April 2019, Walmart got in trouble in California for security screening in the sense that it was manditory and they were not paying for it. California requires breaks for workers and Walmart was effectively making workers use part of their break time to go through security screening.

[https://www.plbsh.com/jury-awards-walmart- employees-6-millio...](https://www.plbsh.com/jury-awards-walmart- employees-6-million-for-security-check-policy/)

I suppose that's not exactly the same since it only covers security time eating into break time not, after work time.

</comment><comment><USER29> I'm surprised this hasn't come up before, isn't the US full of e.g. military installations where employees work by the hour and clock in/out, and where there's some gate check going in & out of the installation that might take a non-trivial amount of time? E.g. the CIA & NSA have such gates, and presumably the same goes for a bunch of military and security contractors.

<comment><USER30> Exactly -- can you imagine managing compensation for that time? Would you require hourly employees to have no conversations, no stopping to check their phone, on their way out of the office?

</comment></comment><comment><USER31> Ignoring the obvious immoral nature of wage theft, let's look at the argument people keep saying "they could go work somewhere else".

What if there aren't any other companies they can work for, because Amazon has undercut all their competitors by, among other things, systematically engaging in wage theft.

If wage theft is helping to keep the prices down, and other businesses went bust because they were unable to compete with a large business that was ignoring the law, then that isn't a free market economy, and the victims are now in a position where they have even less power to prevent abuse and wage theft.

The fact that the US courts seem to have decided that mandatory unpaid presence is somehow not something that violates existing Labour law is absurd.

If my booked hours are from X-Y and it takes 25 minutes for your company to get me to the door, then I should have stopped "working" at Y-25 minutes.

If you don't want to pay me to sit around for 25 minutes you can fix your processes so that it doesn't take 25 minutes.

Or alternatively: you aren't permitting me to leave, your not paying me, and you don't believe I've actually stolen anything (eg you're waiting for police to come and arrest me), then that's false imprisonment and the entire management chain involved in it should be sent to jail.

I kid of course, the management chain are the people with money contributing to politicians that are saying illegal imprisonment is awesome.

</comment><comment><USER32> If I would get fired for not wearing clothes, should I get compensated for the time it takes me to get dressed?

Also we could also talk about: dry clean suits, taking showers, cutting hair, shaving, putting on make-up, etc.

<comment><USER33> No, you're generally not on-prem for those tasks. And time for putting on your kit, for jobs that require that, is paid time

<comment><USER32> So it would be all good if Amazon did security checks at home?

<comment><USER33> That's not what "on-prem" means at all. I obviously meant Amazon should comp for on-prem time in security screen

<comment><USER32> Yes, fine. I agree. But if Amazon did the security screens off their property, should they be comped?

Moreover, why not just make the workers salaried so they can't complain?</comment></comment></comment></comment></comment>


Things I Learned Managing Site Reliability (2017) - <AUTHOR> https://zwischenzugs.com/2017/04/04/things-i-learned-managing-site-reliability-for-some-of-the-worlds-busiest-gambling-sites/ <comment><USER2> I really like the point about runbooks/playbooks.

> We ended up embedding these dashboard within Confluence runbooks/playbooks > followed by diagnosing/triaging, resolving, and escalation information. We > also ended up associating these runbooks/playbooks with the alerts and had > the links outputted into the operational chat along with the alert in > question so people could easily follow it back.

When I used to work for Amazon, as a developer, I was required to write a playbook for every microservice I developed. The playbook had to be so detailed that, in theory, any site reliability engineer, who has no knowledge of the service should be able to read the playbook and perform the following activities:

\- Understand what the service does.

\- Learn all the curl commands to run to test each service component in isolation and see which ones are not behaving as expected.

\- Learn how to connect to the actual physical/virtual/cloud systems that keep the service running.

\- Learn which log files to check for evidence of problems.

\- Learn which configuration files to edit.

\- Learn how to restart the service.

\- Learn how to rollback the service to an earlier known good version.

\- Learn resolution to common issues seen earlier.

\- Perform a checklist of activities to be performed to ensure all components are in good health.

\- Find out which development team of ours to page if the issue remains unresolved.

It took a lot of documentation and excellent organization of such documentation to keep the services up and running.

<comment><USER3> A far-out old employer of mine decided that their standard format for alerts, sent by applications to the central monitoring system, would include a field for a URL pointing to some relevant documentation.

I think this was mostly pushed through by sysadmins annoyed at getting alerts from new applications that didn't mean anything to them.

<comment><USER4> When you get an alert, you have to first understand the alert, and then you have to figure out what to do about it. The majority of alerts, when people don't craft them according to a standard/policy, look like this:

      Subject: Disk usage high
      Priority: High
      Message:
        There is a problem in cluster ABC.
        Disk utilization above 90%.
        Host 188.8.131.52.

It's a pain in the ass to go figure out what is actually affected, why it's happening, and track down some kind of runbook that describes how to fix this specific case (because it may vary from customer to customer, not to mention project to project). This is usually the state of alerts until a single person (who isn't a manager; managers hate cleaning up inefficiencies) gets so sick and tired of it that they take the weekend to overhaul one alert at a time to provide better insight as to what is going on and how to fix it. Any attempt to improve docs for those alerts are never updated by anyone but this lone individual.

Providing a link to a runbook makes resolving issues a lot faster. It's even better if the link is to a Wiki page, so you can edit it if the runbook isn't up to date.

</comment></comment></comment><comment><USER4> > It's far more important to have a ticketing system that functions reliably > and supports your processes than the other way round.

The most efficient ticketing systems I have ever seen were heavily customized in-house. When they moved to a completely different product, productivity in addressing tickets plummeted. They stopped generating tickets to deal with it.

> After process, documentation is the most important thing, and the two are > intimately related.

If you have two people who are constantly on call to address issues because nobody else knows how to deal with it, you are a victim of a lack of documentation. Even a monkey can repair a space shuttle if they have a good manual.

I partly rely on incident reports and issues as part of my documentation. Sometimes you will get an issue like "disk filling up", and maybe someone will troubleshoot it and resolve it with a summary comment of "cleaned up free space in X process". Instead of making that the end of it, create a new issue which describes the problem and steps to resolve in detail. Update the issue over time as necessary. Add a tag to the issue called 'runbook'. Then mark related issues as duplicates of this one issue. It's kind of horrible, but it seamlessly integrates runbooks with your issue tracking.

<comment><USER5> _Even a monkey can repair a space shuttle if they have a good manual_

I would like to point out that the dependency chain for repairing the space shuttle (or worse: microservices) can turn the need for understanding (or authoring) one document into understanding 12+ documents, or run the risk of making a document into a "wall of text," copy-paste hell, and/or out-of-date.

Capturing the contextual knowledge required to make an administration task straight-forward can easily turn the forest into the trees.

I would almost rather automate the troubleshooting steps than to have to write sufficiently specific English to express what one should do in given situations, with the caveat that such automation takes longer to write than said automation.

</comment></comment><comment><USER6> It's pretty much organizing 101: study situation, plan, track well, document well but in a practical sense (write docs that people will actually read), get feedback from everybody, learn from your mistakes, admit your mistakes, and make the system and process better going forward.

</comment><comment><USER7> This was posted a while back, and you can see the original thread with more comments here [https://news.ycombinator.com/item?id=14031180](https://news.ycombinator.com/item?id=14031180)

</comment><comment><USER8> I may be out of touch with current affairs, but I don't think I've encountered a single workplace where documentation has worked. Sometimes because because people were only hired to put out fires, sometimes because there was no sufficiently customized ticketing system, sometimes because they simply didn't know how to abstract their tasks into well written documents.

And in many cases because people thought they might be out of a job if they put their solutions in print. I'm guessing managers still need to counter those tendencies actively if they want documentation to happen. Plenty of good pointers in this article, I found.

</comment><comment><USER9> > I was trusted (culture, again!)

This is the kicker - and the rarity. I don't think it's all trust, though. When your boss already knows going into Q1 that he's going to be fired in Q2 if he doesn't get 10 specific (and myopically short-term) agenda items addressed, it doesn't matter how much he trusts you, you're going to be focusing on only the things that have the appearance of ROI after a few hours of work, no matter how inefficient they are in the long term.</comment>


Web Framework Benchmarks - <AUTHOR> http://www.techempower.com/blog/2013/03/28/framework-benchmarks/ <comment><USER2> One of the most interesting things this comparison brings out to me is not so much the differences between the various frameworks (although the differences between options on the same platform is definitely very useful information), but also the issue that few of us seem to think about these days: the cost of any of the frameworks above the bare standard library of the platform its hosted on.

Theres a consistant, considerable gap between their "raw" benchmarks (things like netty, node, plain php, etc.) and frameworks hosted on those same platforms. I think this is something we should keep in mind when we're tuning performance-sensitive portions of APIs and the like. We may actually need to revisit our framework choice and implement selected portions outside of it (just like ruby developers sometimes write performance-critical pieces of gems in C etc.) or optimize the framework further.

I'd like to crunch these numbers further to get a "framework optimization index" which would be the percentage slowdown or ratio of performance between the host platform and the performance of the framework on top of it. I might do this later if I get a chance.

<comment><USER3> I think this is a much needed and excellent point to make. Just take a look at how Go dips down when using Webgo.

<comment><USER4> I'm not sure many people would use webgo in real life. I don't know... maybe some people... certainly not pros.

Also, the 1.0.3 thing is probably dragging on the numbers a bit. 1.1 would boost it a little. Not enough to get it into the top tier... but a little.

Also, for Vert.x, they seem to be only running one verticle. Which would never happen in real life.

Play could be optimized a bit... but not much. What they have is, to my mind, a fair ranking for it.

Small issues with a few of the others but nothing major. I think Go and Vert.x are the ones that would get the biggest jumps if experts looked at them. And let's be frank... does Vert.x really need a jump?

So what they have here is pretty accurate... I mean... just based on looking through the code. But Go might fare better if it used tip. And Vert.x would DEFINITELY fair better with proper worker-nonworker verticles running.

<comment><USER5> The Play app uses MySql in a blocking way, while Nodejs uses mongo. It's not comparable.

<comment><USER6> We have a pull request that changes the Play benchmark (thank you!) so we will be including that in a follow-up soon.

We tested node.js with both Mongo and MySQL. Mongo strikes us the more canonical data-store for node, but wanted to include the MySQL test out of curiosity.

</comment></comment></comment></comment></comment><comment><USER7> _"Among the many factors to consider when choosing a web development framework, raw performance is easy to objectively measure."_

Oh really? Then why did Zed write such an angry rant about how you are doing it wrong?

<http://zedshaw.com/essays/programmer_stats.html>

Can we please see some standard deviations, at least?

<comment><USER8> What's wrong with that guy?

<comment><USER9> He's a fantastic software engineer but he is _very_ abrasive. I've read some of his posts claiming he would fight some other developer in person at a conference if he steps up. He would rent out a ring and he would put his yellow belt to practice.

Really, I'm not making this up. He sounds like a jerk to work with.

<comment><USER10> He's actually a really nice person. He helped me out (to him I was just some stranger on the phone) when I was trying to decide what to do with my career when I was in NYC.

Zed Shaw is probably one the best people you can know in the developer community, a very good guy.

Your sensationalism based on some of the stuff he says on Twitter and Blogs is amusing though.

<comment><USER8> > Your sensationalism

well he doesn't try to be a nice guy in public...

</comment></comment></comment></comment></comment><comment><USER11> I'm torn about this. On the one hand, while I've known my framework of choice (Rails) is slow, I didn't know how much slower it could be in the grand scheme of things. But on the other hand, I'm more shocked by the difference between EC2 and dedicated hardware (10x improvement with rails), and even 89 requests per second (20 query benchmark on EC2) is still a decent amount of traffic. (Plus this doesn't count any optimizations I would make anyway, like caching).

Either way good architectures usually optimize the high traffic or high CPU areas anyway away from a scripted language.

Thanks for the really informative post! Go seems to be a good balance as a high performance language without having to go back to my traumatic Java days.

<comment><USER3> Don't be too disappointed about Rails.

As a rule I like to divide this world into "Featureless" and "Featurefull" products.

When you use Rails, you're aiming to pile up features. You want to react to Product managers, to users, you want to work fast and satisfy the needs of customers - or else you won't have anyone to build to.

In this reality, the fact that you're doing 20req/s is OK. In fact, I'm betting that even when you take Go or Node.js - pile up all of the infrastructure and features that exist in Rails, and pile up a ton of your code - buggy and not buggy - you'll get around the same kind of satisfaction index from users.

This is because your product can be perceived as slow even though your servers are blazingly fast.

On the other side of the spectrum there are "Featureless" products. These are infrastructural products. A logging service. An analytics service. A full-text search. A classification and recommendation engine.

These you don't want to build in Rails. I'm sure you haven't even considered it. These you want to build with one of the top-notch libraries that this survey indicate.

<comment><USER12> Also, there are certain features about rails like thin or unicorn that can drastically increase your overall performance. So in that sense, I think it's a lot more complicated to determine.

</comment></comment></comment><comment><USER6> I worked with Pat (pfalls) on this effort. He pulled the benchmarks together and built the script to automate the tests. We aimed to deploy each framework/platform according to best-practices for a production environment and then stress test common operations: JSON serialization of objects and database connectivity. We were surprised by the wide spectrum of performance we observed and hope that this interesting to you as well. Four orders of magnitude in one of our tests!

If you have any questions or see something we stupid we did, please let us know. We'd like to correct any mistakes straight away, especially since we're certainly not experts on all of these frameworks and platforms.

<comment><USER2> I'd be interested to see performance for Vert.x on its other hosts (this is the JVM version, I believe).

<comment><USER6> Interesting point. You're correct, we've only tested Vert.x as a Java/JVM platform.

<comment><USER13> I agree, seeing vert.x with it's other language options would be interesting.

</comment></comment></comment></comment><comment><USER9> Where is ASP.Net MVC? Odd that you list obscure frameworks like Wicket and leave out one of The Big Four frameworks.

(The big four in my book are: ASP.Net MVC, Rails, Django and CakePHP)

<comment><USER6> We'd love to have ASP.Net MVC included. One minor gotcha is that to do it justice, we'd need to spin up a Windows EC2 instance and figure out how to script that. It's on our to-do list!

We did briefly test ASP.Net on Mono (see another comment in this thread) but didn't include it since we didn't believe that qualifies as a "production" grade ASP.Net MVC deployment.

<comment><USER14> You should include it; Lots of shops are deploying their products on .NET MVC with Mono.

<comment><USER15> I agree... Let's see what the numbers show for Mono, and on Windows.

</comment></comment></comment></comment><comment><USER16> I'd like to see how .Net MVC would compare. I realize you'd have to spin it up on a Windows EC2 instance and there would definitely be some variance in the performance of that box vs. the nix EC2 instances but I'd still be interested in seeing how it fares in comparison.

<comment><USER6> We agree. We aim to provide a .NET MVC test soon. We did briefly test that on our i7 hardware and if memory serves me correctly, it clocked in at around the position as Spring.

But don't quote me on that! :)

<comment><USER17> I would very much love to see:

(win | mono) + (httphandler | asp.net mvc | webapi | servicestack | nancyfx)

it would hopefully compare with java stacks!

</comment></comment></comment><comment><USER18> > This exercise aims to provide a "baseline" for performance across the > variety of frameworks. By baseline we mean the starting point, from which > any real-world application's performance can only get worse.

I disagree with the implication here (that this is a good point for comparison because "real-world application's performance can only get worse."). Yes it can only get worse but _how much_ worse (per unit of "features") is both significant and unaddressed.

This isn't the best example but look at the gap between the top and bottom of the scale in the _Database access test (single query)_ and _Database access test (multiple queries)_ charts: In the first, Gemini is ~340x faster than Cake, in the second, only ~23x faster. There is still a big gap but it closed by an order of magnitude once you stepped past the most trivial possible DB access test.

So nodejs or php-raw is faster than cake at a single DB access, but what about when you create a real world scenario with authentication, requirement to be able to update features faster (i.e. use an ORM), env. portability requirement, etc.? It seems to me this would look like _a little slower, a little slower, a little slower_ in the {raw} versions, and _already included, already included, already included_ in Rails or Cake. The full featured frameworks take a lot of their performance penalty up-front, with less of a hit as features are added (maybe? :P).

My point is that it's not reasonable to assume that hackernews-benchmarks will actually reflect production use. That said I think the article is cool, and agree that it's good to keep framework authors' feet to the fire regarding performance!

<comment><USER19> This is completely loaded. Your implication is that the only viable test is a test which exercises all of the functionality of the most feature rich framework. How would that be a)viable and b) meaningful?

We know that there is a set of common features and the benchmarks goal is to test least common denominator stuff on the networks. Authentication and portability are not LCD. The argument that they are is capricious. What if we made the requirement be that the framework is a lisp? Now we've completely changed the intent.

<comment><USER18> I meant to suggest that comparing php-raw to Rails is apples & oranges- not "you must benchmark in a way that benefits larger frameworks", just "please acknowledge that LCD tests like this inherently cast Railsy frameworks in a bad light."

It's like condemning a swiss army knife because it's not as efficient as a fixed blade at cutting apples. Well yeah that's true, but what about when you need to screw a screw or pull a cork? One is a multitool, it doesn't make sense to compare it to a specialized tool unless all you plan to do is cut apples.

</comment></comment></comment><comment><USER20> Would've loved to see <http://servicestack.net> on this list which has great performance on .NET and Mono: [https://github.com/ServiceStack/ServiceStack/wiki/Real- world...](https://github.com/ServiceStack/ServiceStack/wiki/Real-world- performance)

And also maintains .NET's fastest JSON and Text Serializers: [http://theburningmonk.com/2011/11/performance-test-json- seri...](http://theburningmonk.com/2011/11/performance-test-json-serializers- part-ii/)

<comment><USER6> Thanks for the tips on these. We'll add ServiceStack to our to-do list. As you might imagine, that list is getting long as a result of some great community feedback. Pat (pfalls) is diving into the pull requests this morning.

</comment></comment><comment><USER3> pfalls - amazingly, I spent the last 2 days of my holiday doing the same thing for a future open source project. I was just stumped when I saw you guys did the same (could have saved me a couple of days!)

I wanted to find the leanest Web framework on any kind of platform; but the difference from your approach - I already knew the kind of code that would run on it.

I tested: Go, Java (servlet, dropwizard), Scala (scalatra), Ruby, Node.js (connect).

For me it was:

* Scala

* Java

* Clojure (equal to Java - big surprise here)

* Node.js

* Go (almost equal to Node.js)

* Ruby (far far down)

Scala took the lead with amazing results. More over, a good metric was latency which Scala was the only one to take micro-second resolution.

I'm not a fan of Scala because of its surrounding tools, which is why I'm still considering going for either Clojure or Node.js.

I think the most surprising positively was Clojure, being that it is a dynamic language. And most surprising negatively was Go - by itself is impressive, but when given real work (Web handling, Redis/mongodb) goes bad quickly. Happy to see this correlates with your findings too; I'm assuming this is a symptom of library maturity..?

I'd be happy to see how Scala fares on your tests.

You've done an awesome job!

<comment><AUTHOR> Thanks for the comment!

This started out as a small exercise, that quickly ballooned because we were curious about every framework and platform. Obviously we had to stop somewhere, but we're very interested in adding more tests in the future. In fact, we're hoping the community will help us out as well!

<comment><USER3> Yes, I know the feeling :)

What started as a couple of hours of exercise for myself ended up as 2 days of hacking and barely sleeping, as surprises in my assumptions kept unfolding, and as I wrote and rewrote POCs just to validate that Clojure is as fast as the number say, and that Scala is faster than Java, etc.

</comment></comment></comment><comment><USER21> 1) The Python version has some basic newbie coding errors. This sort of code is what Python programmers call "Java written in Python". It may be a valid algorithm in Java, but it's the wrong way to do it in Python. Code like this will work, but it will be slow. Depending on the size of "queries", you are potentially allocating gobs of memory in two different places for no reason, and then throwing it away without using it. I wouldn't be surprised if the examples in other languages had similar problems.

2) The JSON serializer in Django 1.4 uses a method which is known to be very slow, but which is easily portable across different platforms and works with older versions of Python. They no doubt included for easy bundling. In a real application you would probably want to simply use the normal JSON serializer from the standard library (which is many times faster).

3) The examples are little more than "hello world". I did some benchmark tests with several Python async frameworks, Pypy, and Node.js for an application I was working on. With small JSON objects there wasn't much difference in performance. Once you started using large JSON objects the performance lines for all versions were indistinguishable from each other. The performance bottlenecks were in libraries, and those standard libraries were all written in 'C', so interpreter versus compiler versus JIT made little difference.

4) The problem with "toy" examples is that in real life there are two performance factors which must be taken into account. Think of as y = mx + b. With a toy example you are probably only measuring "b". With most real life applications it's "m" that matters. There are often different optimization approaches that are best for varying ratios of "b" and "m". You have to know your application intimately and benchmark using data which is realistic for that application.

Python has a reputation for being "easy to learn". However, it is "easy" in the sense of being able to hack something together that works without knowing very much. There can be several different ways of doing things and doing it one way versus another way can mean a difference in performance of several orders of magnitude. The same may be true for some of the other languages, but I haven't examined them in enough detail to say.

</comment><comment><USER22> Numerous irregularities plus a strong vested interest in the JVM make me doubt they have given adequate shrift to Go, here.

Given the amount of interest in Haskell and Yesod around here, it is strange that it is missing.

<comment><USER23> >Given the amount of interest in Haskell

I see more people making uninformed "haskell sucks" posts than expressing interest in it.

>and Yesod

Really? Yesod is the anti-haskell haskell framework.

<comment><USER24> > Really? Yesod is the anti-haskell haskell framework.

Can you please elaborate. Being interested in Haskel web development and trying to choose web framework makes me wish for more information.

<comment><USER25> I wouldn't call Yesod "anti-haskell". By default, it relies on QuasiQuotes and TemplateHaskell a lot [1], which are extensions to the GHC. So by default, you'd have a hard time running Yesod applications on anything else but GHC (the Glasgow Haskell Compiler). These extensions allow you to write in an EDSL that generates Haskell for you. IMO, Yesod's use of these extensions are a benefit, as it allows the user to get stuff like type-safe URLs in HTML for free (e.g. you put href=@{Home} on your HTML element and Yesod will ensure that the value interpolates to a route that exists _at compile time_ ).

Haskell libraries often depend on language extensions, whether it is overloaded strings or type families or whatnot... so I think it's strange that Yesod gets picked on for doing the same: taking advantage of the tools provided by GHC to create a better environment for the developer.

[1] <http://www.yesodweb.com/book/haskell#template-haskell-14>

<comment><USER26> Hugs is now defunct (last release in September 2006, doesn't even support the 2010 language standard), so there is no reason that being GHC-only should be a consideration in selecting a Haskell framework. It's the only real option.

</comment></comment></comment></comment></comment><comment><USER27> Would love to see how these results compare to some of the web frameworks for concurrent functional languages like Erlang/Haskell: Nitrogen, Chicago Boss, Snap, Yesod, etc.

<comment><USER25> ditto. I hear Warp (the server behind Yesod) is a beast.

<comment><USER6> I'm not familiar with Warp. Would one of you guys be willing to help us put together a test for Yesod?

<comment> josh-j #haskell, #yesod, #snapframework on freenode are very helpful.

</comment></comment></comment></comment><comment><USER28> This is exactly why I decided to use PHP for my startup. I have something along these lines that I hope to blog about in the coming weeks (I tested php- fpm on nginx/go/node.js/silk.js and php won by a landslide when it came to speed).

I would love to see php-fpm on nginx included in this test.

<comment><USER29> The problem with php is that it looks great on (some) micro-benchmarks, but on real apps under real sustained load it certainly turns to cold dog shit from time to time for no apparent reason.

<comment><USER30> What are you basing this on? I've been using PHP for well over a decade in high load environments and never experienced it turn "to cold dog shit" .. any issues I have experienced had a good reason, not "no apparent reason".

But then, I've never used a PHP framework in all the time I've used it .. maybe that has something to do with me never having had negative issue with PHP.

</comment></comment></comment><comment><USER31> As a Rails developer and admirer, this is eye-opening. I love the framework (and Ruby especially), but these numbers bear some serious consideration.

30-50x performance difference gets really... real, no? The standard refrain of "throw more hardware at it" must reconcile with the fact that a factor of 30-50x means real dollars for the same amount of load. Is the developer productivity really that much greater?

<comment><USER32> Preface: This post is going to come across as a Rails apologist piece, but please read the entire thing before you reach a conclusion. Please also consider that you could apply these same arguments to just about any of the high-level language based frameworks on the list. I use Ruby on Rails in my comparisons, but I'm a huge fan of Node.js, Python/Django, and Go.

I fully respect the JVM family of languages as well. I just think that Mark Twain said it best when he said: "There are three kinds of lies: lies, damned lies, and statistics." It's not that the numbers aren't true, it's that they may not matter as much, and in the way, that we initially perceive them.

Performance is certainly something you should consider when selecting a language/framework, but it is not the only thing.

</comment></comment><comment></comment><comment></comment><comment></comment><comment>

You should undertake a detailed examination of these statistics before making any decisions.

Issue #1) The 30-50x performance difference only exists in a very limited scenario that you're unlikely to encounter in the real world.

Look carefully at the tests performed. The first test is an extraordinarily simple operation: take this string, serialize it, and send it to the client. This is the test in which we see massive differences:

Gemini vs Rails

25,264/687 (gemini/rails-ruby) = 36.774

25,264/871 (gemini/rails-jruby) = 29.000

Node.js vs Rails

10,541/687 (nodejs/rails-ruby) = 15.343

10,541/871 (nodejs/rails-jruby) = 12.102

That's a 37x performance win for Gemini, and 15x for Node.js.

Side note: You might be wondering why I didn't compare to the top performer, Netty. Netty is more like Rack. You build frameworks on top of Netty, not _with_ Netty. As a Ruby dev, you could think of this in the same context of comparing Ruby on Rails with Rack; not a good comparison. Hence We won't compare Rails to Netty.

The error would be in extrapolating that a move to Gemeni or Node.js would give you a 37x or 15x performance increase in _your_ application. To understand why this is an error, we jump down to the "Database access test (multiple queries)" benchmark.

Issue #2) Performance differences for one task doesn't always correlate proportionally with performance differences for all tasks.

In the multi-query database access test, we start to see the top JSON performers slow down significantly when compared to the slow down for Rails:

Gemini vs Rails

663/89 (gemini/rails-ruby) = 7.449

663/108 (gemini/rails-jruby) = 6.138

Node.js vs Rails

116/108 (nodejs-mysql-raw/rails-ruby) = 1.077

60/108 (nodejs-mysql/rails-ruby) = 0.555

In this scenario -- which is arguably much closer to the real world -- Ruby on Rails closes the gap and even beats some of the hip new kids.

But why? The in-depth answer to this question would require a lot of space, but the really, really short version is kind of a "what's the sound of one hand clapping" response: Ruby isn't actually all that slow.

To understand what the hell that means, check out this presentation from Alex Gaynor (of rdio/Topaz fame):

[https://speakerdeck.com/alex/why-python-ruby-and- javascript-...](https://speakerdeck.com/alex/why-python-ruby-and-javascript- are-slow)

Ruby is just about as fast as C, provided you're comparing it to C that does _exactly the same_ operations on the hardware as the Ruby code. Don't get me wrong, that's a HUGE provision. But it warrants close examination.

The real benefit of lower level languages like C is that they give you the flexibility to drill down in to your actual bare-metal operations and optimize the way the program executes on the hardware. As Alex points out, we don't currently have that level of flexibility in languages like Ruby (without dropping down to inline C), so we suffer a performance penalty.

This penalty is _huge_ for simple tasks because they involve only a handful of operations that execute extremely quickly. As you add complexity, however, the benefits of micro-optimizations get lost in the vastness of the overall execution time.

Look at it like this. When Gemini hits 36,717 req/s in the JSON test, each request only lasts about 1.6 ms. This is only possible because of the simplicity of the operations being done on the hardware. Ruby loses big here because there is a lower boundary to the way you can optimize without dropping down to C.

gemini: 1.6 ms per request

rails-ruby: 87.3 ms per request

When we look at the multi-query database access test, we can see how the optimization at the low level gets lost in the sea of time taken to process the request.

gemini: 90.5 ms per request

rails-ruby: 674.2 ms per request

Granted, that is still over a 7x performance win for Gemini, but this is where the Ruby arguments about programmer efficiency come in to play. I don't know Gemini, so it may very well beat Rails in that comparison too. Ruby is getting more performant with every release though, so it's easier to justify on the basis of preference alone when we're this close.

<comment><USER33> Don't conflate Ruby with Rails. Ruby _is_ slow:

[http://benchmarksgame.alioth.debian.org/u32/benchmark.php?te...](http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=ruby&lang2=v8)

[http://benchmarksgame.alioth.debian.org/u32/benchmark.php?te...](http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=jruby&lang2=v8)

and so is Python:

[http://benchmarksgame.alioth.debian.org/u32/benchmark.php?te...](http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=python3&lang2=v8)

The only time Ruby or Python are fast is when the program is not running Ruby or Python but running some C code underneath. If your programs only consist of that, you can very well say "this 'Ruby/Python' code is fast". But as soon as you have something that isn't in your standard library, welcome to the actual language, and welcome to performance problems.

Elaborating on the implications of this: whenever you actually _use_ the language to do some abstraction, you pay heavily for it: [http://bos.github.com/reaktor-dev-day-2012/reaktor-talk- slid...](http://bos.github.com/reaktor-dev-day-2012/reaktor-talk- slides.html#\(31\))

<comment><USER32> You should really check out Alex Gaynor's slide deck. Nothing I said disagrees with what you've said here, provided you take the entire thing in context.

</comment></comment></comment><comment><USER34> How about Lift? Btw, the play framework you tested is Java or Scala based?

Either way, I'm shocked to see Play perform so slow comparatively. Although it's easily 10x faster than rails on most tests, I'm shocked to see Node.js faster than Play! (by 2x in most cases) Wow!!

Maybe Node.js critics should start appreciating it after all..

<comment><USER35> It is probably worth noting that while we strive to make the tests as fair as possible, we followed the official tutorials for each framework when building out the tests but we fully expect there to be small instances where minor tweaks improve a given test. Given that I am no Play expert, it would be of great value to have one who is (and it sounds like you could lend a hand there) to check out the code on the github page. If we did anything wrong with the setup or in general, we would rerun the tests. Again, we followed all the official 'getting started' posts for each framework, so we believe we have best practices used.

Disclaimer: I am a colleague of the author of the linked article.

<comment><USER36> There are a few problems with your Play code that are causing it to be unnecessarily slow.

First-- what you're really testing here is the Jackson library. A majority of the cycles used in your application are being burned in that toJson call of an array of objects. This isn't a fair test compared to the servlet implementation because you're calling Jackson against a map in the Play example, versus against a simple String in the servlet example.

Second-- you are running database calls serially, and those are blocking. Considering that you're using the more-or-less default Play/Akka configuration, there are only enough threads as you have available processor cores. I would start by increasing the parallelism-factor and parallelism-max to be higher, so you'll have more available threads. More importantly though, the database access should be wrapped in a Future, and you should be returning asynchronously. This should speed up the application by a huge amount.

<comment><USER34> Do you think such a configuration could outrun the Vert.x configuration they've posted? I'm not challenging you, I'm just genuinely curious! Because if Play+Akka can outrun Vert.x, then it would be an interesting game altogether...

<comment><USER36> I think Play, with well-written asynchronous code, could approach the Netty/Vert.x speed. In other words, I'd be willing to trade the ease-of-use of Play for the slight speed impairment vs. writing directly to Netty/Vert.x/etc.

<comment><USER6> We'd love to test that theory. Can you or any Play expert rewrite our Play code and submit a pull request?

</comment></comment></comment></comment></comment></comment><comment><USER37> This seems to be a nice benchmark. For the Python group, I would suggest two things: (1) include a lightweight framework like Bottle, and (2) Try pypy.

<comment><USER6> Thanks. Agreed, we'd love to get a Python micro-framework in the test. If you have some free time and feel like putting together a test for Bottle as a Github pull request, we'd really appreciate that.

</comment></comment><comment><USER38> I'm most surprised that PHP seems to be around an order of magnitude faster than Ruby on Rails, I knew it was faster, but didn't think it would be that much.

<comment><USER39> The comparison would be php-raw vs ruby. The actual "php" benchmark did just as poorly as rails.

</comment></comment><comment><USER40> What kind of server did you guys use for your rails test? Thin, Puma, Unicorn? Are you sure you ran it in production environment?

Update:

Looks like passenger in development mode. Good job you benchmarked a web server that no one uses wile reloading all code between requests.

Update2:

Ok it seems to run in production mode but still, passenger is not an idiomatic choice.

<comment><USER41> I'm not familiar with Rails. Could you explain what you mean in layman terms? Why is code being reloaded on every request by default?

<comment><USER42> In development mode Rails will reload code on each request to pick up on changes you have made to your application. That way you can interact with the application to help verify that your code is working properly.

As of Rails 3.2 development mode watches for file changes and attempts to only reload those files, but it's still a significant performance issue.

By default all Rails applications start in development mode, so one gotcha of benchmarking Rails is that some people will forget to set the mode correctly. That said, from the setup code[1] (line 14) it looks like they were running passenger in production mode. The max pool size seems excessive, especially when running on large ec2 instances, but I'm not fully convinced that it's out of line.

[1] [https://github.com/TechEmpower/FrameworkBenchmarks/blob/mast...](https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/rails/setup_ruby.py)

</comment></comment></comment><comment><USER43> Interesting - C# should have also been added. Java still rules the roost. If you should absolutely have a scripting language - old php with warts is better. More magic in the framework - more abstraction and indirection and code inefficiency - that can be the spoil port when it comes to performance.

<comment><USER6> We agree and want to get a C# test in there. It's among the top priorities for us.

</comment></comment><comment><USER44> What I can take from this is that when you use ORM, it slows things down considerably. Also, looking at rails example, you didn't use active record, which is really wrong.

I think you should tweak your tests to use more real world like examples. I realize it would be hard to do this across frameworks.

Like let's have a database query pull user record from 100,000 users by username. And maybe do md5 on password.

</comment><comment><USER45> How can you write a web framework benchmark and not include some of the non mainstream languages with probably the most performant frameworks like Erlang (Cowboy, Mochiweb), Haskell (Yesod, Snap Framework)? That's just wrong; anyway.

<comment><USER46> Oh... and you think Erlang or Haskell frameworks are mainstream while you fail to mention ASP.net?

</comment></comment><comment><USER47> There is a huge difference between raw PHP and CakePHP. I'd be curious to see other PHP frameworks (such as Zend, or Slim) in there-- is Cake just particularly slow, or is that simply what happens when you have a PHP framework?

<comment><USER48> I'm curious if they configured php with apc or zend optimizer. The huge difference is easy to explain as parse overhead for the framework's code, which happens on each request if you're not using a bytecode cache.

<comment><USER49> Yep, this is exactly what I was wondering. Opcode caching is a key part of production PHP environments - in this case, since the code isn't changing, they should even disable the "change check" (apc.stat=0) as one would do in a production environment.

And if this is the case with their configuration of PHP, it makes me wonder what other platforms are not configured for production in this benchmark :)

</comment></comment></comment><comment><USER50> Utter crap.

"Sadly Django provides no connection pooling and in fact closes and re-opens a connection for every request. All the other tests use pooling."

But it's free, open-source software and we provide asynchronous database connection pooling for Postgres SQL:

<https://github.com/iiilx/django-psycopg2-pool>

<comment><USER51> Your comment is valid and would have been vastly improved without the first two words.

<comment><USER50> I'll elaborate on the first two words:

They're shilling for their company with a config and tools I wouldn't be caught dead using. No idea what other craziness lurks in the other daemon configs. It's irresponsible and misleading. They're misrepresenting the framework I use to do my work and probably others while hoping I or someone else is going to do their work for them. "Outsourced CTO services?" Their trash. My lawn.

Someone's going to eventually ask me to develop the rest of xyz in node and I'll have to repeat myself about articles like this. Bad enough when it's bloggers. Worse when it's self-shilling company that's obviously not willing to put the time in to be what they claim to offer.

</comment></comment></comment><comment><USER52> I'm curious to see Django results when using the gevent worker for gunicorn. For these type of quick JSON calls, you can see huge performance increases.

<comment><USER53> Along with gevent, it would be good to throw in psycogreen to improve DB (well, postgresql) evented connections.

<comment><USER6> It looks as if we've got a Github pull request including these changes, so we'll be able to revise the Python-Django numbers soon.

</comment></comment></comment><comment><USER54> I Will love to see dotNet (C#) incluid in this test. Asp.Net WebAPI (Synchronous and Asycnhrounous) Asp.Net MVC (Synchronous and Asycnhrounous) Asp.Net HTTP Handlers (Synchronous and Asycnhrounous)

<comment><USER55> Also ServiceStack vs ASP.NET MVC vs NancyFX vs Fubu, Mono vs IIS/windows, default serializer vs JSON.NET vs ServiceStack's, etc. There are tons of variations that could be done.

<comment><USER56> ServiceStack vs WCF would probably be a more apt comparison, but I suppose there are people using SerivceStack for web apps as well.

</comment></comment></comment><comment><USER57> haha, all those hipster developers using rails can now eat the php guys shorts :)

Seriously though, this isn't news to anyone that does this professionally. The further up the abstraction curve you climb, the less performant the code will be. Ease of development vs run-time performance.

<comment><USER58> Exactly. And since human time is much more expensive than CPU time, very few people are writing their web apps in machine code.

</comment></comment><comment><USER59> What I'd love to see paired with this data is a cost comparison. At what scale does performance of ruby/python/php become cost prohibitive? Twitter made the move from Ruby to Java some years back, did they ever post a comparison of their numbers before and after?

Also, the difference between EC2 and local i7 hardware is glaringly obvious. At what scale does owning the server hardware become imperative?

I know these questions are beyond the scope of a performance review, but inquiring minds would like to know.

<comment><USER6> As you might imagine, during this exercise, we've had a lot of conversations about the points you raise. We have our own opinions, but we ultimately removed most of that content from the blog post because we didn't want it to be too editorial. We will be posting follow ups with some of our opinions.

Some things are really difficult to answer in a vacuum. If you already have a competent devops staff, hosting your own hardware is probably beneficial. The increased performance per "server" is substantial. But no devops staff? Then it's either very risky or cost-prohibitive to own hardware.

<comment><USER60> I too was shocked at the deltas between Amazon and dedicated hardware. I think AWS runs on Xen, so I wonder if you could strike a more optimal performance/flexibility balance using lighter virtualization (LXC or OpenVZ) with either in-house hardware or another VPS provider.

<comment><USER61> While it is true that EC2 runs on a customized version of Xen, it's very unlikely that latency is being introduced by the hypervisor itself. With paravirtualized kernel and drivers, Xen introduces negligible overhead, and thus LXC would likely be no better.

The reason that the virtualized setup performs more poorly than the dedicated setup is that you are fighting for CPU time with other AWS customers, so those other customers are introducing latency into your application. Any shared/virtualized host will have this problem.

Interestingly, where Netflix really wants to squeeze CPU performance out of EC2 instances, they allocate the largest instance type so that they know that there's nobody else on the underlying machine.

<comment><USER62> Regarding performance of Amazon, this post from 2009 is (still) very interesting:

<http://uggedal.com/journal/vps-performance-comparison/>

Amazon performance is surprisingly low, but also surprisingly consistent. For some use cases, consistency (knowing what you get you for what you pay) might be worth a considerable hit in performance.

</comment></comment></comment></comment></comment><comment><USER63> What would be much more interesting than "peak responses per second," which is a weird metric to begin with, is the actual histogram of sampled throughputs. Or at the very least a box-and-whisker plot (<http://en.wikipedia.org/wiki/Box_plot>).

Most folks who have run Rails at scale, for example, find that the untuned garbage collector in MRI (Ruby's default interpreter) introduces a large amount of variance, for example.

<comment><USER6> We don't have a box plot, but we have line charts for all of the data (performance at multiple client concurrency levels). Just click the "All samples (line chart)" tab on the data panels.

(Note that the very first data panel in the intro is an image and doesn't have tabs.)

</comment></comment><comment><USER64> No love for Flask? I would have love to see how it compare to Django and RoR

</comment><comment><USER65> I'd love to see how PHP 5.4 compares. In my own app, I saw a noticeable speedup and RAM usage per request dropped by half.

</comment><comment><USER66> One glaring ommision: DOS on Dope [1]

[1] <http://dod.codeplex.com/>

</comment><comment><USER67> It would be nice to see raw Python like you have raw PHP. I would expect Django to perform very poorly unless you optimize it's caching.

</comment><comment><USER2> What was the parallelization like across these tests? Were they all running single thread/process mode or did you try to take advantage of threading/multiple-processes/etc. to optimize a production-like performance across all the different frameworks? If the latter, that's a really impressive amount of work!

<comment><USER6> The short answer is that we attempted to use the CPU as fully as possible across all frameworks. So for those that had tunable parallelism, we used the settings that seemed best given the number of cores available on each platform (2 for EC2 Large, 8 for i7).

We posted the deployment approach for each framework to the Github page.

</comment></comment><comment><USER68> This is super awesome. I wish Yesod/Warp was available though :)

<comment><USER69> I've just send a pull request[1] with an Yesod implementation.

It runs pretty well, scoring similar to webgo for the JSON pong benchmark, is almost at the same level as grails for the 1 query benchmark and is slightly faster that Play for the last benchmark.

So, Yesod is in the same performance gap as Play or Grails, and is 3~4x faster that Django or Rails.

But I've tested those on a mono-core Virtual Box, and I know Yesod scales pretty well on a multi-threaded environment.

Also, keep in mind that most of the top performing frameworks are not fully featured web framework but asynchronous I/O libraries (netty, go, nodejs, vertx, ...) which implementations just write mindlessly the raw response directly on the socket whatever the HTTP request was.

[1] <https://github.com/TechEmpower/FrameworkBenchmarks/pull/39>

<comment><USER6> Thanks, Raphaelj! Pat (pfalls) will be in touch if he has any questions. Really appreciate the contribution!

</comment></comment></comment><comment><USER70> What's the difference between "php" and "php-raw" in some of the data? Maybe I'm still in my morning fog, but having trouble thinking of what "php-raw" might mean. Sigh.

<comment><USER71> The code says php-raw refers to using PDO (which all project should be using) vs using an ORM or ActiveRecord.

I am completely stunned by the performance cost of using ORM/AR, and will be using this to shame our team lead into giving it up and going for raw queries.

<comment><USER72> Some of the ORM cost can be mitigated by using caching. In most cases this is essential in a production deployment.

<comment><USER6> Agreed. However, for our database tests we expressly wanted to stress-test the ORM and, where configurable, disabled caching.

We plan a subsequent test, time permitting, that enables caching.

</comment></comment></comment></comment><comment><USER73> Isn't it that django and rails has flat curves because they are by nature blocking. So it wouldn't matter how many request you throw at them as they are limited in how much they can handle at once.

And to on top of this compare database requests is meaningless as the blocking nature of the framework itself is the major bottleneck, and not the database.

Now, for a normal web application, the largest amount of request would come from static content, or cached content within the web app so the real gain would be a tiny fraction between python/ruby and go/java-based frameworks.

That said, if you want to handle static content (images and such) from within your app, or build a java script-centric application with lots of tiny requests, or even persistent once...nor rails or django would do.

</comment><comment><USER74> I roughed up a flask benchmark but I haven't been able to test locally.

If you want to help, check out this pull request: [https://github.com/TechEmpower/FrameworkBenchmarks/pull/14/f...](https://github.com/TechEmpower/FrameworkBenchmarks/pull/14/files)

<comment><USER6> Awesome, thank you! We'll aim to get this incorporated into a follow up post soon.

</comment></comment><comment><USER75> A few additions/tweaks that would be great to see:

1) Add a raw http test -- no template compilation or html, just return "OK". Would give a relative idea of the cost to "just turn the thing on"

2) Don't json encode after the database tests. By json encoding you're doing two things but saying you're only testing one.

I come from the python/django world, and I know that different python json packages have orders of magnitude differences in their performance. From that I can infer that there are probably similar or greater cross-language differences -- I suspect node.js having json as a native object type helps immensely.

</comment><comment><USER76> Why are there no Go results for the DB access benchmarks?

<comment><USER77> I'd be interested to know this as well. I can understand time constraints in compiling these kind of comparisons, but as I'm about to embark on a web project in Go, I'd be interested to know if there was any technical constraints that prevented benchmarking Go.

<comment><USER6> We recognize that deficiency and we do aim to add database tests for Go. If you could quickly draft that up and submit a pull request, we'd love to add it.

<comment><USER77> Sorry, but as much as I'd love to contribute I'm still learning how to write database apps in Go myself (that's actually part of the reason I wanted to see your tests). So I'd be the wrong person to to write code for that particular test.

</comment></comment></comment></comment><comment><USER78> Very nice benchmark. As developer of a toy "framework", but powerful http server library, I wanted to check on my project. I did a fast blog entry at <http://bit.ly/10l9Smj>. I got ~58288.10 for simple json, 8594.39 on db using sqlite, 503.23 for 20 requests.

Anyway for me its more important speed of development than performance on the server. Maybe my servers do not get that many visits.

<comment><USER6> Oh this is awesome! Very nice performance for a mobile CPU.

Pull request, maybe? :)

</comment></comment><comment><USER79> Would love to see how modern Perl frameworks (Mojolicious/Dancer) ranks in such a test.

<comment><USER6> Interesting thought. Would you be able to put together a test for one of those? pfalls can give you the details for how we expect the test for a new framework to work.

</comment></comment><comment><USER80> Cake was an interesting choice for a PHP framework to test. I wonder why they didn't choose Symfony, which is arguably the leading PHP framework.

<comment><USER81> Zend and Symfony are probably the leading OO MVC frameworks for PHP.

I'd also like to see a "light" framework meant for building APIs, like Slim, for instance.

<comment><USER80> Yes, I'd definitely like to see Slim tested as a light framework. People keep mentioning Silex as a "light" framework, but I've found it to be almost as heavy as Symfony2 (which isn't much of a surprise considering it's just Symfony2 components strapped together).

</comment></comment></comment><comment><USER82> Im surprised to see that Sinatra on JRuby often performs worse than Sinatra on MRI, while Rack on the other hand performs much better.

<comment><USER6> We were surprised by the sinatra-jruby tests as well. If you read our "expected questions" section, it's not clear to us why Sinatra's performance on JRuby was weak. We'd love to hear from a JRuby expert about how to address Sinatra's "wrong" looking numbers.

<comment><USER83> Maybe the web-server choice (I didn't look to see what that was). But last I looked at it, the Sinatra router really is very naive/awful.

For the size of the framework, that may be the right choice ultimately.

On the other end of the spectrum is Rails, who've written their own Regexp engine for routing basically. It seems to be generally quite a bit faster.

All major Ruby frameworks have just awful routers though really.

</comment></comment></comment><comment><USER84> It would be very interesting to see OpenResty (Nginx + Lua) in there, since it's so different from other approaches.

<comment><USER85> I would love to see Openresty tested, for simple json and databases Openresty is a magnificent tool.

</comment></comment><comment><USER71> I would love to contribute a code for a specific PHP framework: Silex. Do you have requirements you'd like to hit?

<comment><USER6> That would be fantastic. Get in touch with pfalls on Github and he can give you the information. It's fairly simple.

<comment><USER86> +1 this would be interesting given that there are a lot of PHP frameworks besides cake, namely.

Silex/Symfony2

Yii

Zend

Kohana

Fuel

Laravel

<comment> johnx123-up I'll be happy to see benchmarks with PHP frameworks written as a C extension: 1. Yaf PHP <http://www.yafdev.com/> , 2. PHP-ActiveRecord++ <https://github.com/roeitell/php-activerecord-plusplus>

</comment></comment></comment></comment><comment><USER87> Very interesting! But isn't there a disavantage for node.js considering it's single threaded? Did you cluster it to use every core on the box ? (<http://stackoverflow.com/a/8685968/1909827> \- "Scaling throughput on a webservice")

<comment><USER59> From the OP's response to a similar question:

>We attempted to take advantage of threading/multiple-processes as best we could (see the nodejs code for an example of using the cluster module). But we suspect there are additional areas of improvement here.

<comment><USER87> Thanks

</comment></comment></comment><comment><USER88> Since a few people have asked about Haskell, here are some Haskell benchmarks in comparison: [http://www.yesodweb.com/blog/2011/03/preliminary-warp- cross-...](http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross- language-benchmarks)

<comment><USER89> Still, it would be nice to have these results independently verified and put alongside all the rest.

What do you think, bhauer? :)

<comment><USER6> Our to-do list is getting unwieldy. :) We would love to get this added, though.

Any chance a Haskell expert could create a test and submit it as a pull request?

<comment><USER89> It sure sounds like it is!

I'm a far cry from a Haskell expert unfortunately, so I'll have to leave it to someone else.

</comment></comment></comment></comment><comment><USER90> What I've also found is that Node (V8) tends to have much higher variance in response times when compared to Java Servlets (JVM): <https://github.com/olegp/common-node#benchmarks>

</comment><comment><USER91> In the FAQ for the benchmarks, could you also add a bit about how you configured the JVM (OpenJDK?). Curious about heap settings, etc.? Did you just use the default install? e.g. <http://planet.jboss.org/post/rhel_openjdk_performance_tuning> [http://www.jaspersoft.com/sunopenjdk-jvm-garbage- collection-...](http://www.jaspersoft.com/sunopenjdk-jvm-garbage-collection- tuning-tutorial)

</comment><comment><USER92> >And let us simply draw the curtain of charity over the Cake PHP results.

Something about that phrase "Let us simply draw the curtain of charity..." resulted in an immediate spittake. Coffee everywhere.

</comment><comment><USER34> Thank you for such an informative comparison. You've helped shed light beyond the frameworks that are known to most of us - Ruby on Rails, Node.js, Django, Express, etc...

Thanks again! :)

</comment><comment><USER6> In case it's not obvious, you can hide frameworks/platforms of no interest to you to narrow the view. For example, here's Node.js versus Express:

[http://www.techempower.com/blog/2013/03/28/framework- benchma...](http://www.techempower.com/blog/2013/03/28/framework- benchmarks/#hide=1,2,3,0,27,7,30,11,12,13,15,14,17,16,18,19,21,20,22,23,24,25,26,29)

(Note the initial chart in the introduction section is an image and it won't be affected.)

</comment><comment><USER93> Quickly taking a glance -- these benchmarks (like most benchmarks) seem like they might be highly misleading.

For instance, in the Express example code, they're sending JS objects rather than serializing them to raw data that the socket can just send. Instead, serialization/copying are happening on each request, which is a significant overhead.

I don't have domain knowledge over many others, but I suspect a similar problem might exist with others.

</comment><comment><USER94> For json serialization, this benchmark seems to indicate Netty is twice as fast as Golang. Don't think that's right. The golang benchmark code is not exactly equivalent to netty benchmark code.

The netty code creates the ObjectMapper once and uses it for all requests, whereas golang code creates the json encoder for every request (enc := json.NewEncoder(w)). Just getting rid of that would make this trivial code so much faster.

</comment><comment><USER95> Also I dont think evaluating json based on a simple 'Hello World' is a valid test. In fact, 'hello world' should never be the standard to test the speed of any processes. If all your script does is to output 'hello world' to the screen, why bother using a server-side programming language at all? You are better off just writing it in HTML, its faster than using any server-side and client-side languages lol.

</comment><comment><USER96> It just goes to show that your framework of choice is pretty unimportant. The developers (and their skills), who are actually developing on and configuring the framework, outweigh the "baseline" for performance on multiple orders of magnitude. From that I'd say that developer friendliness (easily approachable concepts) and sensible defaults is by far the most important thing when choosing a framework.

</comment><comment><USER97> These sort of "benchmarks" are so subjective that they really don't provide any value. Looking at the framework lineup, a lot of the frameworks at the bottom have so many (tightly coupled) features (which also lead to bloat, like excessive middleware layers) that they're obviously not going to perform anywhere near as well as some of the barebones frameworks at the top. Neat post, but yeah, zero value.

</comment><comment><USER98> Go's performance is great, and hearing good things about it, does any one have any experience on the type of applications this language is meant for?.

</comment><comment><USER99> We need a project similar to TodoMVC [1] for benchmarking different languages and frameworks.

<http://todomvc.com/>

</comment><comment><USER100> I think this benchmark is not that useful.

If you seriously thought that the difference between a netty and django would be 4 times then you simply don't understand what these frameworks do in the first place.

I would have guessed something like less than 100 times slower and that would have been still fine since the cost of all kinds of latencies in the system usually far outweigh the speed of the framework itself.

</comment><comment><USER101> These are some brutal results for CakePHP (which I use). However, in practice no intermediate developer would be issuing queries like that in a loop. They would loop through a set of data, building a IN statement example: WHERE field IN ('x','y','z'). Thus only sending a single query to the database. Still, the Cake developers really need to improve the speed of their framework.

<comment><USER22> I keep seeing numbers like this in benchmarks over the last few years, it would be great to see CakePHP's numbers "rehabilitated" using techniques like you discuss.

<comment><USER101> It's a fair way of testing, its just not the way a developer would write it in practice. Clearly disregards the "Big O".

</comment></comment></comment><comment><USER102> I would like to point out that there is no reason you would benchmark a raw SQL query in PHP, and then only use ActiveRecord on the ruby side. At the very least you could have used the Sequel gem to just build a MySQL query for the Sinatra app. ActiveRecord is going to give you the same performance failure that it did in PHP too.

</comment><comment><USER95> Regarding PHP, well, isnt CakePHP by far the slowest major PHP framework? Why dont you test the other PHP frameworks? How about Yii, Codeigniter, Lithium and Symfony? Id say the result is kinda biased for PHP frameworks since you pick the slowest PHP framework available, instead of the fastest or at least the average one.

</comment><comment><USER103> I see alot of people saying how certain configs are missing/better/not tested. So what about a "crowdsourced benchmark" instead?

Maybe a few elaborate scenarios are posted and people can simply submit their best setup/config/code to be benchmarked. I imagine devs would improve on it over time and eventually the most optimized would surface?

<comment><USER35> We are doing precisely that: if there are any mistakes or misunderstandings about the production-level best practices, we are accepting pull requests on our github (set up with all these tests, in case you want to run them yourself) to fix them, rerun them, and then report our updated findings.

</comment></comment><comment><USER104> Not to nitpick, but that (and another popular one [http://www.techempower.com/blog/2013/03/26/everything- about-...](http://www.techempower.com/blog/2013/03/26/everything-about- java-8/)) was a clever way to get people to techempower.com :)

Useful comparison anyway. Seems Go struck a good balance.

</comment><comment><USER105> So this means I should stop using CakePHP?

<comment><USER106> Not really. Take this benchmark with a grain of salt unless they benchmark it again with APC at minimum. Nobody serious about a web app would run a PHP app without APC.

Similarly, relatively modern deployment standards (not really cutting-edge) like nginx and php-fpm OR apache 2.4 with worker mpm + php-fpm should be added to the mix.

<comment><USER6> Asadkn, we'll try to get things revised based on your feedback. Admittedly, we have some learning to do with tuning production PHP environments.

<comment><USER49> I posted a note above that might help:

apc.enable=1 turns on Opcode caching (when php-apc is installed), and apc.stat=0 turns off "stat" checks - this means that once a file is opcode cached, PHP won't even have to touch the file on disk to execute it. The I/O gains from this, as well as the execution gains from not having to parse the file, should help quite a bit.

</comment></comment></comment></comment><comment><USER107> Some of the choices are unfair in an apples/oranges sort of way: They are testing Rails and Sinatra against Java servlets, but the Ruby equivalent of servlets is not a high-level framework like Rails, but Rack. (Also, the Ruby tests use Passenger, which is probably not a great choice for performance.)

</comment><comment><USER108> Probably not a major factor but I'm curious to know why mongoose was thrown into the mix for the node.js test rather than going with the native mongo driver.

It might be more of a real world test to include mongoose with the node+express test, but for the node-only test the native driver might be more appropriate.

<comment><AUTHOR> We wanted to use an ORM in all cases, it was only recently that we started working on native mysql access. We hope to add native mongodb results as well.

</comment></comment><comment><USER109> The wsgi benchmark uses gunicorn, which is fine. But if you are surprised by the so-so performance, know that the worker class can be changed via the -k flag (-k gevent), and may improve performance. Of course, other wsgi servers, like uwsgi, are also available.

<comment><USER50> Are they not even using gevent? Someone please get these guys off the internet. The are worse than some personal blogs at everything except the comprehensiveness in their low-quality testing.

</comment></comment><comment><USER110> Nothing for Flask ?

<comment><USER111> Yeah I was disappointed to see a lack of flash as well, especially since it advertises itself as a microframework and all.

<comment><USER6> We received a Github pull request with a Flask test! So we'll aim to include that in a follow up post soon.

</comment></comment></comment><comment><USER112> It's interesting to note the time per request when you invert these. Even some of the most drastic differences (like Spring vs. Django) turn out to be the difference of a millisecond or two. That's pocket change in terms of user experience.

<comment><USER113> It is a good and interesting observation, but as the benchmarks approach real- world scenarios, the difference is more than a millisecond or two.

For instance, if you're running on EC2 hardware (which is common enough) and you're executing ~20 DB queries/request (which is probably, unfortunately, common enough), the difference between Java servlets and Rails is more like 10ms.

Then what happens when more than 89 real-world users start to hit your Rails server each second?

(Note: I really like Ruby and Rails. Much more so than Java and its offerings.)

</comment></comment><comment><USER114> How much of the difference is due to the random number generator calls? They aren't free or equal cost across platforms by any stretch. I really have a hard time trusting these numbers with how casually calls to RNGs are bandied about...

</comment><comment><USER34> For anyone else curious on how Vert.x stacks up against the famous Node.js:

[http://vertxproject.wordpress.com/2012/05/09/vert-x-vs- node-...](http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js- simple-http-benchmarks/)

<comment><USER115> you haven't read discussion, right?

<comment><USER34> I posted this way before the discussion happened.

</comment></comment></comment><comment><USER116> How much does 'asynchronous' matters for the performance of a web framework? I mean netty, node.js are all async frameworks as I understand, but the source code for Go and Compojure seems was using a thread/process per request model?

</comment><comment><USER117> I kinda miss asp.net web api (okay, it's on Windows, but it's also a framework :))

</comment><comment><USER118> Why Play benchmark is running on Resin? Shouldn't it be directly on top of Netty?

<comment><USER6> Play is not running on Resin. Did we accidentally say that somewhere? If so, we'll correct it.

<comment><USER119> Here: [https://github.com/TechEmpower/FrameworkBenchmarks/tree/mast...](https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/play- java)

The tests were run with:

Java OpenJDK 1.7.0_09 Resin 4.0.34 Play 2.1.0

<comment><USER6> Whoops! Fixing that up presently.

Thanks for the catch.

</comment></comment></comment></comment><comment><USER120> I'd be curious to see how ruby fares using a setup other than apache + passenger; I have a feeling that nginx with unicorn or puma would provide better results, and might give it a go when I have a bit more time.

</comment><comment><USER121> Hi, great work! I only have two suggestions:

a) Please, publish not only the requests per second, but the memory and CPU usage of the machine for each framework. b) For JAVA systems, can you publish de heap configuration of the JVM?

Cheers!

</comment><comment><USER122> wow, these results and the performance of go is making me consider rewriting my tornado app again. I just put off doing it in order to build more stuff in to the python version. Maybe I'll reprioritize.

</comment><comment><USER123> If I wanted to return a bunch of _ids from a mongo database i would do a _id:$in[array of ObjectIDs] and then stream the resulting cursor to res. Streams are core to node. You should use them.

</comment><comment><USER124> JVM can use many cores at the same time node/rails only use one core. The test is totally nonsense.

You should show us the cpu usage. If you had done so, you would have found how absurd the mistake you had make.

</comment><comment><USER125> The raw json output merely tells about the performance of the language itself. Nice, but not that interesting if you need to get the job done and don't happen to know 10+ languages/frameworks.

</comment><comment><USER126> I haven't looked at this detail yet, but it should be noted that we haven't even optimised Vert.x yet so there should be plenty of scope for further improvement :)

(Disclaimer: I'm the Vert.x project lead)

</comment><comment><USER127> I guess it is a good thing we are finally migrating away from Cake :/

</comment><comment><USER128> I wonder how a cgi binary run from xinetd would perform?

</comment><comment><USER129> Java (JVM) > JavaScript (Node.JS) > Ruby-Rails

<comment><USER130> If all you're doing is trying to serve JSON as fast as possible.

</comment></comment><comment><USER131> I still believe launching a usable web application next week is preferable to launching a really fast web application 3 months from now, if ever.

<comment><USER132> That's a straw man. Competent programmers should be able to code fast code in a fast manner.

<comment><USER131> Different languages and platforms yield very different productivity levels.

</comment></comment></comment><comment><USER133> I am 99% sure that you haven't used contain=>false for cake php this way all related tables are loaded to serve the related data.

</comment><comment><USER134> Can't believe you didn't include Zend in there :(

<comment><USER135> Just read this above:

"We've got Zend as a next target for PHP frameworks."

</comment></comment><comment><USER136> Thanks. We are reconsidering our stack and are in middle of evaluation, I am sure this post is going to be of great help.

</comment><comment><USER137> You're using PDO in the PHP raw test - use direct mysqli_* API, it's lot faster than the PDO abstraction layer.

</comment><comment><USER138> Wow, this benchmark is like comparing apples, oranges, mangos and cherries. Just because they are all fruit.

<comment><USER139> It's fine as long as people take it for what it is. I still find the fruit salad interesting :-)

</comment></comment><comment><USER140> Very useful info. Thanks for sharing.

</comment><comment><USER141> Was Play 1 or Play 2 tested? I thought Play ran on Netty so I'm surprised it didn't fair better.

<comment><USER142> They're using Play 2.1 with Java, without using futures for database queries. Not sure how representative of real usage that would be, though.

<comment><USER6> We've got a bunch of feedback that the Play database test needs to be asynchronous, so we'll make that a priority for our next run. Perhaps I can entice you to submit a pull request to improve the Play configuration?

</comment></comment></comment><comment><USER143> Woah....PHP is faster than Ruby in lot of results? I wonder why is this the case?

</comment><comment><USER144> Wasn't it agreed a long time ago that benchmarking against a VM was a bad idea?

<comment><USER6> Possibly, although we believe it represents precisely what we wanted to test: a realistic production environment.

However, we also tested on our physical i7 hardware. Did you happen to scroll down? :)

<comment><USER144> I did, but didn't see a pretty graph for it. Full production results are interesting, but benchmarks should test on a single variable. A cloud VM adds several to the mix.

</comment></comment></comment><comment><USER145> This is awesome. Thank you.

</comment><comment><USER146> node.js is single threaded and EC2 large instance has 4 CPUs. So to be fair you must either:

a) bench on a single core processor (a small EC2 instance)

b) configure node.js as a cluster with as many instances as processors.

</comment><comment><USER147> Needs more NancyFX + Mono! Nice post tho, very interesting.

</comment><comment><USER148> Could you kindly add error bars to your test results?

</comment><comment> a-b I would love to see Dropwizard in this benchmarks!

</comment><comment><USER149> What about C++ Web frameworks?

<comment><USER6> Don't think we didn't consider it! :) If you are willing to craft a comparable test for a C++ framework, we'd definitely like to get one into the next set of numbers.

We especially don't feel confident in our C++ chops to do a C++ framework justice.

</comment></comment><comment><USER150> ...flask?

</comment><comment><USER151> im not a PHP nazi, but you can't compare PHP and a framework

</comment><comment><USER152> You guys should feel bad about generating such awful benchmarks.

How the hell can you compare accessing a MySQL database to accessing a MongoDB database?

Its like comparing apples to piles of poop.

Also when you're testing things like Django in web requests, you're testing gunicorn, not Django.</comment>


Kleiner's Bing Gordon: gamers should make $3 an hour while playing - <AUTHOR> http://venturebeat.com/2011/06/30/kleiner-perkins-gordon-gamification/ <comment><USER2> Oh no, this guy completely misses the point. I can't believe he threw everyone into one bucket of "gamers". Do I want my games to be profit-driven crap like Farmville? Heck no.

I mean, I guess if we want games to be soulless and casual, sure. Thankfully we have indie gaming and some other nice companies to prevent that...</comment>


Skype As We Know It May Not Exist Much Longer, eBay Says - <AUTHOR> http://www.readwriteweb.com/archives/skype_as_we_know_it_may_not_exist_much_longer_ebay.php <comment><USER2> This smells of a heavy-handed ploy by Skype's founders to force the sale back to them of Skype for a low price. If eBay did indeed not purchase the core IP along with Skype, then they have no one to blame but themselves.

</comment><comment><USER3> It's the end of the world as we know it...

I really don't think that there is much or a danger of skype disappearing - it's too valuable. Worst case scenario is that it reverts back to it's previous owners and/or continue under a different name.

But, realistically, I doubt that anything will change. EBay has deep pockets, and I'm sure that they won't give this up easily. I doubt that they would license a technology, and then lose the license without a fight. Ebay does not like egg on its face.

<comment><USER4> Do you mean EBay? I'm confused how Google is involved in this.

<comment><USER3> My bad, EBay. All other comments still apply.</comment></comment></comment>


Browser plugin that adds NSA-trolling keywords to the URLs you load - <AUTHOR> http://boingboing.net/2013/09/18/browser-plugin-that-adds-nsa-t.html

<comment><USER2> He would have started with a better keyword list if he'd cribbed the spook.lines file from Emacs' spook.el extension. I've been using this since the eighties in various places, as have others.

<comment><USER3> At least here it keeps it simple for most of the people to use it!</comment></comment>