24

使用 FastCGI C++ 与 PHP/Python/Perl 做同样的工作有哪些优缺点。

任何性能或设计缺陷或使用其中一个?甚至欢迎您的意见。(告诉我为什么一种或另一种岩石,或一种或另一种很烂)。

4

16 回答 16

31

脚本语言可能比 C 慢,但这是个问题吗?几乎从不。如果性能出现问题,您开始只翻译关键部分。

twitter/ruby 就是一个很好的例子;红宝石很慢。一些语言特性(首先使 ruby​​ 很好)只是阻止了不同类型的优化(jruby guy 有一篇很棒的文章关于这个......是 ola bini 吗?不记得了)。

尽管如此,twitter 还是由 ruby​​ 驱动的,因为 ruby​​ 足够快。不久前,“博客”报道 twitter 出于性能原因迁移到 scala ......事实是,只有消息传递队列(和后端的其他部分)迁移到 scala。雅虎运行多种语言;php 用于前端,其他更快的语言用于性能至关重要的地方。

那么,为什么性能不那么重要呢?有几个原因:

  • 数据库瓶颈:不是脚本慢,是数据库慢
  • 客户端瓶颈:在浏览器中呈现比请求花费的时间更长。优化服务器端,没人会注意到
  • 水平扩展:添加另一台服务器通常比优化应用程序更便宜,因此每秒请求数增加三倍
  • 开发人员的时间和维护是项目中最昂贵的部分。您将在更短的时间内获得比支持 Web 的 c-coders 更便宜的 python 开发人员来维护您的应用程序
  • 无需编译,开发周期短

另一个支持脚本的观点:许多脚本语言支持内联或包含快速(C)代码:

  • 蟒蛇,内联c
  • php:c 中的扩展
  • 通过 rhino 的服务器端 javascript:直接访问 java/jvm (orf.at 就是一个很好的例子,它是奥地利最大的网站之一,由helma提供支持- 服务器端 jvm-interpreted javascript!)

我认为,尤其是在 Web 开发中,高级脚本的优点远远超过缺点。

于 2009-04-30T09:54:56.493 回答
23

几年前,我或多或少地在工作中学习了 Web 应用程序编程。C 是我所知道的主要语言,所以我用 C 编写了(相当大规模的)网络应用程序。严重错误。C 的字符串处理和内存管理很繁琐,再加上我缺乏 web 应用程序的经验,它很快就变成了一个难以维护的项目。

C++ 会好很多,主要是因为std::string它比char*.

但是,现在我每次都使用 Python(尽管 PHP 并不是一个糟糕的选择,而且可能更容易上手)。Python 的字符串处理非常棒,它可以无缝地处理 Unicode。Python 拥有比 C++ 更好的 Web 工具和框架,并且它的正则表达式处理和标准库(urllib、电子邮件等)运行良好。而且您不必担心内存管理。

如果我受到严重的 RAM 限制(例如在嵌入式微型计算机上),或者如果我在 Google 工作并且正在编写一个必须响应数千个查询的搜索引擎,我可能只会将 C 或 C++ 用于 Web 应用程序每秒。

于 2009-04-30T09:00:35.203 回答
12

使用 C++ 可能会导致应用程序比 PHP、Perl 或 Python 快得多,并且比 C# 或 Java 快一些——除非它花费大部分时间等待 DB,在这种情况下不会有任何区别。这实际上是最常见的情况。

另一方面,由于 benhoyt 提到的原因,用 C++ 开发 Web 应用程序需要更长的时间并且更难维护。此外,它更有可能包含严重的安全漏洞(现在每个人都最担心 SQL 注入和 XSS - 但如果他们用 C++ 编写他们的 web 应用程序,那将是缓冲区溢出,这将是他们的整个网络被 p0wned 而不仅仅是数据)。

这就是为什么现在几乎没有人用 C++ 编写 Web 应用程序的原因。

于 2009-04-30T09:08:44.357 回答
9

我认为应该有人成为 Webapp/C++ 主题的先驱,来测试地面并提供概念验证解决方案。

随着 STL 的到来和 Boost 的开发,使用 C++ 解析文本变得非常容易。两年前,如果我必须解析 CSV 数据,我会使用 Python 或 PHP。现在我将 C++ 与 STL/Boost 一起使用。将CSV文件读入向量?没问题,简单的 getline + boost::split + lexical_cast。计算成对向量中的数据总和?没问题:

pair<int, double> sum_int_double(pair<int,double> & total, pair<struct in_addr, pair<int,double> > & a) {
    total.first += a.second.first;
    total.second += a.second.second;
    return total;
}
pair<int,double> mixedSum = accumulate(mixedVec.begin(), mixedVec.end(), emptyPair, sum_int_double);

将数据从地图传输到成对向量?没问题:

mixedVec.assign(amap.begin(), amap.end());

一切都定义明确且清晰。字符串操作、正则表达式、算法、OOP 等一切都在 C++ 中定义良好且成熟。如果您的应用程序将是真正的应用程序,而不是基于解析的文本,那么 C++ 的 OOP 特性也是不错的选择。

于 2009-04-30T09:39:25.953 回答
7

问题是“创造的价值在哪里?”

如果您认为价值是在内存管理、仔细的类设计和让夜间构建工作中创造出来的,那么请使用 C++。您将花费大量时间编写大量代码来完成重要的事情,例如删除不再引用的对象。

如果您认为价值在于部署人们可以使用的应用程序,那么将 Python 与 Django 框架一起使用。Django 教程向您展示了在大约 20 分钟内您可以启动并运行一个应用程序。它已准备好生产,您可以专注于重要的事情:

  • 该模型。只需用 Python 编写模型,ORM 层就会为您处理所有数据库交互。没有 SQL。没有手动映射。

  • 演示文稿。只需在 HTML 中设计您的页面,并使用一些{{}}“在此处填写值”和一些{% for thing in object_list %}构造,您的页面就可以使用了。没有字符串操作。

  • 视图函数。编写简单的 Python 函数来封装站点的处理部分。不是验证(那些在表单中),不是表示(在模板中),不是底层模型(在模型类中),而是一点授权检查、查询处理和响应制定。由于 Python 有一组丰富的集合类,所以这段代码最终会变得非常简短且切中要害。

  • 其他的东西。URL 映射是 Python 正则表达式。表格与您的模型相匹配;您可以对默认值进行子类化以添加自定义输入验证和处理。

  • 用于低级模型功能以及端到端操作的精彩单元测试框架。

没有内存管理,没有带有抽象和接口的严谨的类设计。不用担心如何优化字符串操作。没有夜间构建。只创造真正有价值的东西。

于 2009-04-30T10:21:35.120 回答
6

如果您希望能够在现有的运行进程(例如守护程序)中实现 Web 服务,该进程是用 C/C++ 编写的。使该进程为该接口实现 FastCGI 协议是有意义的。让 Apache 处理与外界的 HTTP(2 路 SSL 等)并通过套接字通过 FastCGI 处理请求。如果您在 PHP 中执行此操作,则必须让 PHP 与您的进程对话,这意味着维护 PHP 代码以及您的进程。

于 2009-04-30T10:10:36.283 回答
4

拥有一个 FastCGI Web 应用程序(无论是 C++、PHP、Perl、Python、Ruby 等)都可以比 CGI 应用程序提供更好的初始启动时间。初始启动时间是指从Web 服务器收到请求到运行您编写的第一行代码之间的时间,因此初始启动时间是您的 Web 应用程序的访问者必须等待的最短时间对于每个请求。初始启动时间为 1 秒并不罕见,尤其是当您的应用程序很大或使用大型框架(例如 Ruby on Rails)时。FastCGI 在响应第一个请求后保持您的应用程序运行,因此 FastCGI 减少了所有后续请求(第一个请求除外)的初始启动时间,通常降至几毫秒。

如果您使用 PHP,通常其默认配置会提供足够好的初始响应时间(即使没有 FastCGI),但请确保您在生产服务器上使用 PHP 加速器(请参阅http://en.wikipedia.org/wiki/PHP_accelerator ) 以获得更好的性能。

大多数编程语言和框架允许您通过更改应用程序的配置,而无需更改代码,以不同的服务器模式(例如 CGI、FastCGI、内置 Web 服务器、Apache 模块)运行相同的应用程序。在编写应用程序时,FastCGI 通常不是最佳选择,因为在更改代码后,您可能必须重新启动应用程序以便它接收您的更改,但重新启动 FastCGI 应用程序通常很麻烦。重新启动 CGI 或内置网络服务器要容易得多。您应该只在生产配置中设置 FastCGI。

于 2009-04-30T09:50:21.683 回答
3

之前有人问过这个问题:http ://cppcms.sourceforge.net/wikipp/en/page/main

CppCMS 项目提供了一个使用 C++ 进行 Web 开发的框架。

您可以查看以下基准以了解有什么区别:http ://cppcms.sourceforge.net/wikipp/en/page/benchmarks - 大约两个数量级。

PHP/Python 的问题,他们非常慢,在 PHP 的 FastCGI 过程中缓存数据有很多问题。

C++ 最大的问题是 C++ 中的 Web 开发资源少。但是,采用像 CppCMS 这样的框架会使生活变得更加简单。

于 2009-04-30T11:07:42.247 回答
3

这里有一个中间立场。Python(我相信 Perl 和 Ruby)允许您从 C 调用函数。100 次中有 99 次,您不需要这样做。但是很高兴知道如果您需要,该选项就在那里。

通常对于 webapps,编程语言的速度根本不是问题。在执行单个数据库查询所需的时间内,处理器可以执行数十亿条指令。发送和接收http数据大致相同。

于 2009-04-30T13:45:47.470 回答
2

您可以将 FastCGI 与 PHP/Python/Ruby/Perl 一起使用,以获得足够的运行时性能,直到您的网站变得非常大。即使这样,您也可以在不放弃脚本语言的情况下进行架构改进(数据库调整、缓存等)以实现更大的扩展性。一些相当大的网站是用 PHP/Python/Ruby/Perl 完成的。

使用高级语言获得的最大好处是程序员的性能。这是你首先应该担心的。快速响应用户的功能需求比将页面响应时间缩短几毫秒更为重要。

于 2009-04-30T09:09:41.360 回答
2

嗯...您将使用 C/C++ 与 Python/Perl/Ruby/Java/.NET 节省内存和 CPU 功率。如果使用 C/C++ 节省的资源占可用资源总量的很大一部分(在机器人的嵌入式板上运行的 FastCGI),那么是的,C/C++。否则,何苦呢?

于 2009-09-24T07:20:51.877 回答
2

可能你们中的某些人可能会对 Wt [1] 感兴趣,这是一个完全用 C++ 编写的 Web 工具包。它可能是 cppCMS 的替代品。在这些圣诞节假期我都在尝试..

[1] http://www.webtoolkit.eu/wt

于 2009-12-30T10:00:47.673 回答
1

太糟糕了,没有 C/C++ 与 Perl CGI 的基准。
如果没有 FastCGI,我认为 C/C++ 会快很多,使用 FastCGI 可能会更快(但可能会少一点——所有初始化部分都执行一次)。
同样,这非常依赖于应用程序,因此应该为不同的动态网页提供某种基准。

我个人认为,如果您的公司拥有资源,它应该/可以投资于 C/C++(鉴于他们必须找到合适的资源......),否则最好坚持使用脚本语言。
当然,如果您想部署快速应用程序,您应该使用 C/C++。

归根结底,编译语言更快。但是现在可能很难找到好的 C/C++ 开发人员?

干杯,

于 2009-08-24T10:47:50.023 回答
1

C++ 是一种强类型语言……也就是说,您可以声明整数、浮点数等……通常,您可以比使用弱类型语言更高效地进行编程。Facebook 报告说,从 PHP 切换到 C++ 时改进了 50%。我认为脚本语言是原型语言……当您希望生产级效率使用编译语言时。

于 2012-02-10T16:48:03.970 回答
0

我通过 Google 进行的每次搜索都表明 C/C++ 为需要功能的网络应用程序提供了最佳性能,例如在网页中搜索信息或从数据库中获取信息。

于 2012-02-11T18:04:15.833 回答
0

对此有一些新的答案。

  1. 如果你需要一个编译的应用程序,你可能会发现Google 的 Go 语言是一种很好的编译语言,具有现代特性。
  2. 使用脚本语言(我使用 Perl)编写应用程序可以通过类似Mojoliciousor的框架完成Dancer,然后通过使用PSGI/Plack控制器,它可以在 CGI、FastCGI、mod_perl、本机服务器(如 Mojolicious 的 Hypnotoad)或云部署上运行, 都没有修改。其他脚本语言也存在类似的概念。
于 2012-02-11T18:44:30.430 回答