Perl Web框架之间有性能比较吗?

14

我看到提到Embperl是最快的Perl Web框架的说法(听起来像是毫无根据的意见,并且还过时了)。

我在想,主流稳定的Perl Web框架的相对速度是否有共识或者最好的情况下,是否有基于事实的性能比较,比如同样的示例Web应用程序的实现或单个功能(例如会话处理或表单数据处理)等等?

更新:此问题 特别是 关于执行相同/等效任务的不同框架的速度比较。我很感激大家的好意,但我已经知道,速度不是我应该关注的唯一标准。我不需要哲学建议。信不信由你,作为框架,您实际上可以通过在它们上面运行具有相同目的的任务/代码/应用程序(例如使用给定的模板插入呈现给定的表单等)来进行苹果比苹果的比较,即使每个框架的完整功能不是100%相同。


3
你不会把拖车和跑车进行比较,对吧?如果你需要厨房,那么跑车的速度就无关紧要了。所以,这取决于情况。 - matthias krull
2
你可能需要缩小范围.. "Web框架"是一个非常庞大的类别.. 当然,速度取决于你如何使用它等因素。查看代码可能有所帮助,但我想其他决策对性能的影响比代码的“速度”更大。 - Øyvind Skaar
Øyvind Skaar - 你說得有一定道理(性能的其他因素也很重要),但某些潛在的平台差異確實存在(例如,可以參考bvr答案中的鏈接作為證明)。 - DVK
你对这个问题并不是很了解。如果你只询问一个框架的速度,而不考虑它执行的任务类型,那么你将得到截然不同的结果,没有赢家。你必须定义一个“典型”的工作负载,从那里基准测试将为你提供一个初始选择。你还必须记住,如果涉及到互联网,那么连接速度将淹没处理请求的微小差异。如果你正在使用数据库,那么你的注意力可能最好集中在那里,而不是在Web服务器上。投票关闭。 - Borodin
@Borodin - 没有互联网。没有数据库(在应用程序服务器上缓存的内存数据作为后端)。任务类型非常多样化。如果您不理解为什么有人需要知道答案,这并不意味着这是一个糟糕的问题。喊出已经在问题下“但我已经知道速度不是我应该关注的唯一标准”中注意到的100%显而易见的事情并不是展示您的聪明才智的方法。 - DVK
显示剩余2条评论
4个回答

12

我不想深入讨论解释问题(对于大多数真实场景,这些开销根本没有任何影响)- 但这是我的测试结果:

1. 纯Plack

zby@zby:~/progs/bench$ cat app.psgi 

sub {
   my ( $env ) = @_;
   return [
       200,
       [ 'Content-Type' => 'text/text' ],
       [ 'Hello World' ]
       ];
}
zby@zby:~/progs/bench$ plackup
HTTP::Server::PSGI: Accepting connections at http://0:5000/

使用简单的ab -n 10000命令,我得到了:

每秒请求数:2168.05 [#/sec](平均值)

2. Dancer

zby@zby:~/progs/bench$ cat dancer.pl 
 #!/usr/bin/perl
           use Dancer;

           get '/' => sub {
               return "Why, hello there";
           };

           dance;
zby@zby:~/progs/bench$ perl dancer.pl 
>> Dancer server 1950 listening on http://0.0.0.0:3000
== Entering the development dance floor ...

用类似的 A/B 测试我得到了:

每秒请求数:1570.49 [#/sec](平均值)

3. Mojolicious::Lite

zby@zby:~/progs/bench$ cat mojo.pl 
 # Using Mojolicious::Lite will enable "strict" and "warnings"
    use Mojolicious::Lite;

    # Route with placeholder
    get '/' => sub {
        my $self = shift;
        $self->render(text => "Hello!");
    };

    # Start the Mojolicious command system
    app->start;
zby@zby:~/progs/bench$ perl mojo.pl daemon
Sat Jan 22 20:37:01 2011 info Mojo::Server::Daemon:320 [2315]: Server listening (http://*:3000)
Server available at http://*:3000.

结果: 每秒请求数: 763.72 [#/sec] (平均值)

4. 催化剂(Catalyst).

不幸的是,代码过长无法在此完整呈现,但Root控制器包含:

sub index :Path :Args(0) {
    my ( $self, $c ) = @_;

    # Hello World
    $c->response->body( 'Hello World' );
}

结果是:

每秒请求数:727.93 [#/sec](平均值)

5. WebNano

zby@zby:~/progs/bench$ cat webnano.psgi

{
    package MyApp;
    use base 'WebNano';
    1;
}

{
    package MyApp::Controller;
    use base 'WebNano::Controller';

    sub index_action {
        my $self = shift;
        return 'This is my home';
    }
    1;
}    
MyApp->new()->psgi_callback;
zby@zby:~/progs/bench$ plackup webnano.psgi 
HTTP::Server::PSGI: Accepting connections at http://0:5000/

结果如下:

每秒请求数:1884.54 [#/sec](平均值)

在添加更多功能后,这将会发生改变。


2
这有点毫无意义,因为你实际上是在测试Web服务器。尝试在Feersum上运行您的Plack应用程序(而不是HTTP::Server::PSGI),您可能会获得每秒请求数量的10倍。尝试在您的应用程序中实际执行操作,您会发现所有框架的性能相同。 - jrockway
好的 - 我添加了更多的免责声明。这只是数据 - 它的意义取决于你的解释。例如,你可以使用这些数据来支持你的论点,即对于实际应用程序,框架生成的开销是可以忽略不计的 :) - zby
您正在比较 Web 服务器 (plackup, mojo daemon 等)。 - dns

9

感谢你!+1,我现在接受了这个,除非将来有更全面/有用的内容被添加。 - DVK
请记住,这些基准测试是针对cgi环境的。对于大多数框架,您应该使用mod_perl。 - runrig
3
我已经写了上面的比较,不会基于它选择一个框架。一旦你有了一个真正用于自己目的的应用程序,就将其与框架组合起来进行基准测试。你可能会发现,在大局观中,框架所扮演的作用很小,而除了速度以外,其他特性更重要,因此较慢的框架 可能 是更好的选择。 - Mark Stosberg

7
我知道这并没有直接回答你的问题,但我认为目前没有最新的比较,而且我知道也没有全面的比较。要进行彻底的基准测试需要花费至少几周的时间,因为Perl中现在有很多框架,具有许多不同的DB/Template/Server组合和应用程序的不同使用模式可能会产生重大的性能差异。
我确信,如果只将Mark的简单2008基准测试作为您问题的答案,那么您将会错过很多。部署对于速度的影响与Web框架一样重要,甚至更重要。例如,Catalyst在原始的“hello world”速度竞赛中不会获胜,但BBC的视频Catalyst应用程序可以服务1,000个并发视频。灵活性、可扩展性和支持不同部署方式成为选择Web框架的重要因素。

Plack是新的、重要的。仅仅一年时间,它就被广泛采用,中间件/插件得到了很大的发展,并得到了几乎所有框架的支持。Starman引擎用于plack应用程序非常快,并支持热加载和工作进程增量/减量。由于现在几乎所有的Perl框架都可以运行为.psgi,因此您可以在Starman + nginx(或lighttpd)上运行任何您想要的东西。有数十种良好的部署组合以及在过去两年中Web框架领域中的相当多的变化和新条目。

如果您正在进行现代Web开发,请确保选择一个具有websocket支持的工具包。这本身就会比传统的Ajax显著地提高性能;小请求/响应可以轻松缩小100倍。

附注:除非您需要深入请求周期,否则modperl可能不是选择最佳的持久化部署。它有许多注意事项和细节,并将您与apache绑定在一起(一个伟大的服务器,但远远不是最快的选择)。

祝你好运!

2016年10月20日更新:uWSGI非常适合用于Perl的PSGI应用程序。


3
Apache/mod_perl可能不是我搜索的灵活选项,但是因为我还不确定,所以很高兴你提到了其他选择。非常全面和周到的回答加1分。 - DVK
3
Websockets听起来很有吸引力-感谢您提出这个想法。然而,在实践中,它们似乎几乎没有客户端支持(没有IE支持,没有生产FF支持,并且由于安全问题在FF4和Opera中被关闭(http://en.wikipedia.org/wiki/WebSockets#Browsers_supporting_WebSocket)。 - DVK
@DVK,谢谢!关于WebSockets,是的,它还很早期,但它非常棒并且发展迅速。例如,IE 9看起来对HTML5支持非常好。我还没有尝试过这个,有些代码看起来有点天真,但这是一个超酷的想法:优雅的WebSocket - 允许您编写WebSocket代码,在必要时降级到Ajax。 - Ashley

5

TechEmpower有一些关于框架性能的好比较。请参见http://www.techempower.com/benchmarks/

截至目前,他们已经包括了4个Perl框架(Dancer,Kelp,Mojolicious,Web :: Simple)以及许多其他语言的框架。如果需要,可以过滤结果以仅显示Perl框架。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接