用c++ cgi进行web开发真的会有巨大的性能提升吗?
Will web development in c++ cgi really a huge performance gain?
我在看完这篇文章后提出了这个问题http://stevehanov.ca/blog/index.php?id=95
用cgi代替fastcgi不是一种惩罚吗?
更新:为什么有些人在回答"你得到了20-30%的绩效提高"时假装喜欢?这个数字是纯粹的猜测还是来自可靠的基准?我看过的HipHop的表现更是在10倍的尺度上。
我用几种语言和框架做过web开发,包括python、php和perl。我自己管理它们,我最大的网站每天有大约2万次点击。
任何具有合理速度的语言和框架都可以通过向其投入资源而扩展到每天处理20,000次点击。有些人比其他人占用更多的资源。(Plone (Joomla。我在看你。
我的诙谐网站(还没有在生产中)比我的python网站(例如,使用围攻)需要更多的(从内存中大约5000%)重击。Ie。当我用尽全力攻击它们时,这些机智的网站每秒提供更多的页面。
我知道这不是一个真正的通用测试。
诙谐带给你的其他速度优势:
多线程
如果你使用内置的websver(例如,在ha-proxy之后)部署,并让你的应用程序是多线程的。它将比perl或PHP应用程序加载更少的内存。
一般来说,对于php和perl应用程序,你会让Apache为每个传入的连接启动一个进程,每个进程加载整个php解释器,所有的代码、变量和对象等等。对于像Joomla和Wordpress这样的大型框架(取决于插件的数量),每个进程的内存消耗都非常巨大。
使用Wt应用程序,每个会话加载一个WApplication实例(一个c++对象)和它的整个树的小部件和东西。但是,无论有多少连接,代码使用的内存都保持不变。
内置Web2.0特性
一般来说,传统的应用程序,他们仍然围绕着旧的"http请求进来"。"我们提供网页服务"……"完成"式的事情。我知道他们一直在添加越来越多的ajax类的东西。
对于Wt,它默认在可能的情况下使用WebSockets,只更新页面中需要更新的部分。它退回到标准AJAX,如果不支持http请求。通过启用AJAX和WebSockets的客户端,可以持续使用相同的WApplication c++对象。所以在建立一个新的会话和所有这些方面没有速度损失。
回应"c++对于webdev来说太难了"
c++确实有一点学习曲线。在90年代中期,我们用Java j2ee做网站。这在当时被认为是商业上可行的,并且是一个非常痛苦的开发过程,但它确实有一个很好的优势,鼓励良好的文档和编码实践。
使用脚本网站,很容易走捷径而没有意识到它们的存在。例如,我工作过的一个有8年历史的perl站点有一些代码重复,没有人注意到。每次显示一个产品列表时,它都会运行两次相同的SQL查询。
对于c++站点,我认为它的可能性更小,因为在perl站点中,没有那么多的编程结构(比如函数),它只是perl和嵌入的html。在c++中,你可能会有带有名称的方法,最终导致名称冲突。
曾经有一个方法接受int型标识符,后来我们把它改成了uuid字符串。Python代码很棒,我们不认为我们需要改变它;它运行得很好。然而,当你传递一个字符串时,隐藏在深处的小行会产生不同的效果。很难追踪bug,破坏了数据库。(幸运的是,只在开发和测试机器上)。
c++肯定会抱怨很多,并迫使我们重新编写相关的函数,而不是懒惰的bug。
在c++和Java中,编译器会错误并警告许多此类错误。
我发现与脚本语言应用程序相比,在c++应用程序中,单元测试通常不是完全必要的(不要射我)。这是由于语言强制执行了很多你通常放在单元测试中的东西,比如一个python应用程序。
从我到目前为止的经验来看……Wt确实比现有的框架需要更长的时间来开发东西。主要是因为现有的框架有更多的开箱即用的之类的东西。然而,在Wt中制作非常定制的应用程序比在Wordpress中更容易。
与我交谈过的从PHP迁移到Wt(一个c++ web框架)的人报告了显著的改进。从我使用Wt创建的小型应用程序来学习它,我发现它比我创建的相同PHP类型的应用程序运行得更快。随你怎么说,但我被说服了。
这让我想起了20-30年前人们是如何将汇编语言与C语言比较,然后是10-20年前C语言与c++语言比较的。当然,c++会比PHP/Rails更快,但它要花费5倍的精力来构建可维护和可扩展的应用程序。
关键是你在牺牲开发资源的同时获得了20-30%的性能提升。你是想让你的应用运行速度提高30%,还是只实现一半的功能?
大多数web应用程序是网络绑定的,而不是处理器绑定的。用c++而不是高级语言编写应用程序没有多大意义,除非您需要进行非常繁重的计算。此外,编写正确的c++程序也很困难。它将花费更长的时间来编写应用程序,并且由于指针被滥用、内存错误、未定义的行为等,程序更有可能以惊人的方式失败。总的来说,我认为这是不值得的。
每当您消除解释层或操作系统抽象层时,您一定会获得一些性能增益。话虽如此,语言或技术本身并不意味着您的所有问题都会自动得到解决。我修复了c++代码中处理一组相对简单的记录需要花费很多小时的问题。问题在实现中,修复与语言的特性或限制无关。
假设所有事情都正确实现,您肯定会获得更好的性能。问题将是如何找到漏洞。c++的一个问题是,许多开发人员目前都"受过训练",或者习惯于对象背后的内存管理相关的大量细节。这样就不需要考虑诸如"如果我将这个指针传递给几个线程会发生什么?"有时效果很好,但并非总是如此。不管对象是如何隐藏令人讨厌的细节的,您仍然需要考虑语言的一些微妙之处。
根据我的经验,您需要几个经验丰富的c++开发人员来监视代码,以防止错误和内存泄漏失控。
我当然不同意。如果你想在性能上胜过PHP,为什么不使用Java(或者更好的Scala)框架呢?它们更适合web开发,有很好的、相对容易使用的框架,并且避免了c++的许多令人头疼的问题。我一直认为web开发(以及大多数现代非科学/高性能应用程序)的主要优点之一是能够避免C/c++开发带来的头痛。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 在linux上调试巨大的C++项目
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- VS2005调试模式和发布模式之间存在巨大的性能影响
- Mac和Linux下的C++程序(使用GCC编译)的巨大性能差异
- 由于if语句,C++的性能损失巨大
- 巨大的性能差异:调试与发布
- 为什么我看到这些函数之间有如此巨大的性能差异
- 将巨大的2D矢量写入文本文件太慢,如何提高性能
- c++编译器之间的巨大性能差异
- 用c++ cgi进行web开发真的会有巨大的性能提升吗?
- c++仅用一行代码就实现了巨大的性能差异