c++ cgi 中的 web 开发真的会带来巨大的性能提升吗?
Posted
技术标签:
【中文标题】c++ cgi 中的 web 开发真的会带来巨大的性能提升吗?【英文标题】:Will web development in c++ cgi really a huge performance gain? 【发布时间】:2011-07-22 17:03:52 【问题描述】:我在读完这篇文章后问这个问题 http://stevehanov.ca/blog/index.php?id=95
使用 cgi 代替 fastcgi 也不是一种惩罚吗?
更新:为什么有些人会假装回答“你获得了 20-30% 的性能提升”?这是纯粹的猜测还是这个数字来自可靠的基准?我看过 HipHop 的表现更多的是 10 倍的规模。
【问题讨论】:
引用的文章最后建议将 Web 服务器构建到 C++ 应用程序中,完全绕过 CGI。那可能真的很快。 不管怎样,它可能不会像开发速度那样很快地w.r.t程序员的性能;) @Mark 他说“在这个模型中,你直接将你的 C++ 程序编写为 CGI 脚本”,所以据我所知,他没有绕过 cgi @user310291,几页后他补充道:“但还有第三种策略:如果你自己写网络服务器,你可以去掉中间人,直接处理请求。”跨度> @Mark 那么我的问题不在于第三种策略。 【参考方案1】:我用几种语言和框架完成了 webdev,包括 python、php 和 perl。我自己托管它们,我最大的网站每天的点击量约为 2 万次。
只要投入资源,任何具有合理速度的语言和框架都可以扩展到每天 2 万次点击。有些人比其他人占用更多的资源。 (Plone,Joomla。我在看着你)。
我的 Witty 网站(还没有生产中)比我的 python 网站需要更多的(从内存中增加大约 5000%)(使用 seige)。 IE。当我尽我所能用 seige 打击它们时,这些诙谐的网站每秒提供更多的页面。
我知道这不是一个真正的通用测试。
机智为您提供的其他速度优势:
多线程
如果您使用内置的 websrever 进行部署(例如,在 ha-proxy 后面)并让您的应用程序是多线程的......它会比 perl 或 php 应用程序加载更少的内存。
通常对于 php 和 perl 应用程序,您将让 Apache 为每个传入连接启动一个进程,每个进程加载整个 php 解释器、所有代码、变量和对象等等。使用 Joomla 和 Wordpress 等重型框架(取决于插件的数量),每个进程的内存消耗都会变得非常庞大。
使用 Wt 应用程序,每个会话都会加载一个 WApplication 实例(一个 C++ 对象),它是整个小部件和内容树。但无论有多少连接,代码使用的内存都保持不变。
内置的 Web2.0 特性
通常对于传统应用程序,它们仍然围绕旧的“http 请求进入”..“我们提供页面”..“完成”风格构建。我知道他们一直在添加越来越多的 AJAXy 类型的东西。
使用 Wt,它默认尽可能使用 WebSockets,只更新需要更新的页面部分。它回退到标准 AJAX,然后如果不支持 http 请求。使用启用 AJAX 和 WebSockets 的客户端,相同的 WApplication C++ 对象会持续使用..因此在设置新会话等方面不会损失任何速度。
回应“C++ 对于 webdev 来说太难了”
C++ 确实有一些学习曲线。九十年代中期,我们用 Java j2ee 做网站。这在当时被认为在商业上是可行的,而且开发起来非常痛苦,但它确实有一个很好的优势,可以鼓励良好的文档和编码实践。
使用脚本网站,很容易走捷径而没有意识到它们的存在。例如,我工作的一个 8 年前的 perl 网站有一些重复的代码,但没有人注意到。每次显示产品列表时,它都会运行相同的 SQL 查询两次。
对于 C++ 站点,我认为机会较少,因为在 perl 站点中,没有那么多编程结构(如函数),它只是 perl 和嵌入式 html。在 C++ 中,您可能会使用带有名称的方法并最终导致名称冲突。
类型
有一次,有一种方法采用 int 标识符,后来我们将其更改为 uuid 字符串。 Python 代码很棒,我们认为不需要更改它;它运行良好。然而,当你把一根绳子传递给它时,有一条线埋在深处,会产生不同的效果。很难追踪错误,损坏了数据库。 (幸运的是只在开发和测试机器上)。
C++ 肯定会抱怨很多,并迫使我们重新编写所涉及的函数,而不是偷懒。
对于 C++ 和 Java,编译器会出错并警告您很多此类错误。
我发现与脚本语言应用程序相比,C++ 应用程序通常不需要单元测试(不要打我)。这是由于语言强制执行了许多您通常会在单元测试中为 Python 应用程序执行的内容。
总结
根据我目前的经验.. Wt 确实比现有框架需要更长的时间 .. 主要是因为现有框架有更多的开箱即用那里的东西。然而,在 Wt 中制作极其定制的应用程序比说 Wordpress 更容易。
【讨论】:
【参考方案2】:与我交谈过的从 PHP 迁移到 Wt(一个 C++ Web 框架)的人报告了显着的改进。从我使用 Wt 创建的小型应用程序来学习它,我发现它比我创建的相同 PHP 类型的应用程序运行得更快。随心所欲地获取信息,但我被卖掉了。
【讨论】:
什么“重要”? 30% 或 1000% 这是我的隐含问题 :) HipHop 基准似乎说 1000%。 @user310291 他们说,根据他们的应用程序,他们以前的代码库在 110% 到 200% 之间。【参考方案3】:这让我想起了 20 到 30 年前人们是如何将汇编与 C 相结合的,然后是 10 到 20 年前的 C 与 C++。当然,C++ 会比 PHP/Rails 更快,但构建可维护和可扩展的应用程序需要多 5 倍的努力。
关键是您在牺牲开发资源的同时获得了 20-30% 的性能提升。您希望应用运行速度提高 30% 还是实现 1/2 的功能?
【讨论】:
我没有任何论据表明,在许多事情上,正确的 C++ 编写所需的时间比一般的 PHP 更长。特别是当涉及前端(UI)时。但是 C++ 会更容易扩展,因为您可以使用纯异步设计。 Cory,我不确定您所说的“异步设计”是什么意思。你能解释一下吗? +1:我将简单的手工制作的 HTTP 服务器嵌入到我的几个 C++ 项目中。主要原因 - 我知道如何在 C++ 中快速做到这一点,我在 C++ 方面的经验比任何其他语言都多,我不需要为任何第三方库、复杂的部署等而烦恼。但我从没想过关于性能提升, 获得 20-30% 的性能?如果你看 HipHop,性能应该会好 10 倍 Wt 就是这样一个库,它使得用 C++ 编写 Web 应用程序比用 Ruby 或 PHP 更容易,并且使您的应用程序运行速度更快(出于各种原因)。几毫秒的往返时间让用户满意。【参考方案4】:大多数 Web 应用程序都是受网络限制的,而不是受处理器限制的。除非您进行大量计算,否则用 C++ 而不是高级语言编写应用程序没有多大意义。此外,编写正确的 C++ 程序也很困难。编写应用程序需要更长的时间,而且由于指针滥用、内存错误、未定义的行为等,程序更有可能以惊人的方式失败。总的来说,我会说不值得。
【讨论】:
是的,我的计算量很大。 好吧,那可能是有道理的。但是,在尝试使用 C++ 之前,您可能应该先查看 Java 或 C#。【参考方案5】:每当您消除解释层或操作系统抽象层时,您一定会获得一些性能提升。话虽如此,语言或技术本身并不意味着您的所有问题都已解决。我已经修复了需要花费数小时来处理一组相对简单的记录的 C++ 代码。问题出在实现中,修复与语言的功能或限制无关。
假设一切都正确实施,您肯定会获得更好的性能。问题将在于寻找错误。 C++ 的问题之一是许多开发人员目前都“受过训练”或习惯于在对象背后拥有很多与内存管理相关的细节。这样就无需考虑诸如“如果我将此指针传递给多个线程会发生什么?”之类的事情。有时它运作良好,但并非总是如此。无论对象如何隐藏令人讨厌的细节,您仍然需要考虑语言的一些微妙之处。
根据我的经验,您需要几位经验丰富的 C++ 开发人员来监督代码,以防止错误和内存泄漏失控。
【讨论】:
我的问题暗示我当然会有一个 C++ 团队。 有 C++ 开发人员,也有 C++ 开发人员知道他们在做什么。使用 C++ 的长寿并不一定意味着后者。你必须注意那些不知道他们在做什么的人,并迅速纠正它。这是 C++ 开发的不幸现实。【参考方案6】:我当然不喜欢这个。如果您想获得比 PHP 更高的性能,为什么不使用 Java(或更好的 Scala)框架呢?这些对于 Web 开发来说要好得多,有很好的、相对易于使用的框架,并且避免了 C++ 的许多令人头疼的问题。我一直认为 Web 开发(以及大多数现代非科学/高性能应用程序)的主要优点之一是能够避免 C/C++ 开发带来的麻烦。
【讨论】:
Java 仍然比 C++ 慢,因为它使用了一个抽象层,即虚拟机和垃圾收集,它以牺牲性能为代价自动管理内存。 @user310291,没错,但是因为 PHP 太慢而跳到使用 C++ 是一个很大的飞跃,我怀疑是否值得处理所有额外的麻烦。以上是关于c++ cgi 中的 web 开发真的会带来巨大的性能提升吗?的主要内容,如果未能解决你的问题,请参考以下文章