我听到一个谣言,Java 消耗的能量比 PHP 少,我想知道这是否以及如何实现。我目前在一家公司工作,我们的大部分应用程序都基于 PHP。功耗对我们来说从来都不是问题,但我们正在开展可能很重要的更大项目。我们喜欢 PHP 用于 Web 开发,并且想知道这样的谣言是如何传播的,以及它是否是真的。
我听到的例子是 Facebook 正是出于这个原因切换到 Java(不过我似乎在谷歌上找不到任何这些东西)。
由于我的一个客户问我这个问题,如果它是真的,我很想证明它。
计算机并不特别关心它们是在执行 Java 还是 PHP。功耗几乎相同。然后问题就变成了性能问题——如果您可以使用一台服务器处理更多请求,您将需要更少的服务器并消耗更少的功率。或者,如果您不是在做 Web 规模的应用程序,请更快地处理您的请求并花更多的时间空闲,这会消耗更少的电量。
鉴于纯 Java 和纯 PHP,Java 作为静态类型的 JIT 语言当然更快。问题在于,考虑到团队成员和可用的开发工作量,您可以使哪一个更快。
我的看法是,最好的方法是混合语言,使用现有的基于 Java 的基础设施工具,例如 Terracotta 来构建性能关键部分,并更灵活地构建复杂但不那么繁重的业务和表示逻辑。
我真的很怀疑这只是语言问题。
所讨论的平台具有如此多的可变性,以至于无法进行任何通用比较。仅举几个可变点。
我真的怀疑你能否将这么多变量隔离成一个有用的指标。您最多可以选择两个使用相同硬件的等效应用程序(注意所有平台的选择)并进行比较。然后改进最差的,直到它超过更好的。我认为,正确的测量方法是每小时瓦数和每秒请求数。
Ants 的回答(支持他)中指出的关键点是:性能更好的平台总是更节能,只要有足够的需求,因为它能够用更少的硬件服务相同数量的请求。
但是哪个平台性能更好不仅取决于语言,还取决于上面提到的事情(以及更多)。
我对这个问题感到惊讶,直到我进行了谷歌搜索,结果出现了这个问题。这是一个严重的问题,我不会想到的。
现在我在考虑它,我认为这变成了谁支付电费的问题。Sun 的 Java 战略是关于销售服务器:后端为大铁,前端为瘦客户端。
也许像 Flex 之类的技术会将更多的工作转移给客户,让他们承担更大比例的电费。
但我会惊讶地看到能源使用的语言排名。
一个非常有趣的问题。我投票赞成。
多么有趣的问题。用多种语言编写一个应用程序,将它们部署在相同的硬件上,然后测量功耗不是很有趣吗?我很想看看。
如果你真的发疯了,那么一个性能监控工具呢?它除了显示应用程序的每个部分消耗了内存和 CPU 的位置之外,还会显示消耗最多的能量的位置?
现在我希望我能再次投票支持这个问题。
像这里的许多比较问题一样,您可能需要提出一个基准来真正确定这是否正确。
lesswatts.org 有一些关于应用程序电源管理的信息,以及 Linux 系统上功耗的其他几个方面。作为旁注,他们似乎正在使用 PHP,所以这本身可能是值得的 :)
他们不断重复您应该使用PowerTOP来确定哪些应用程序导致的功耗最大,并且您可以从屏幕截图中看到他们至少正在检查空闲状态的唤醒。
大多数情况下,Web 服务器处于空闲状态,然后它“服务”了很短的时间,然后又回到等待下一个连接服务的状态。在这方面,PHP 对整个过程的贡献很小:只有服务部分。所以我想知道实际的基准测试是否是一个特定的基于 Java 的 Web 服务器与服务类似页面的 Apache/PHP 的比较。如果是这种情况,那么 PHP 和 Java 的比较就不是一个公平的比较——通常,两者中的任何一个都被认为是为实际页面提供服务,一次只能活动几毫秒。我认为实际的 Web 服务器,即选择或轮询连接的服务器,会占用大量电源。
您所说的能耗是指瓦特的能耗吗?
我不是 100% 肯定,但即使这是真的,我认为这类似于优化你的代码的一部分,它在你的程序运行时的 0.01% 中执行。
切换将导致的问题(更改生产/发布平台、学习曲线时间损失、新业务软件成本等)将非常严重。我看不到做出如此重要的决定,除非经过严肃的和公司特定的业务分析任务及其相应的结果。
然而,这应该是一个有趣的讨论。
More efficient code does consume less resources, including power. Java in general has a faster, more efficient implementation, so all other factors being constant, Java will probably consume less energy running on a server.
But all other factors are not constant. There's no telling what changes based on your decision to use PHP or Java. For example, Java takes longer to develop, which means that Java programmers have their computers on for longer, and their power usage from that may surpass your savings on the server.
If you are Google, Amazon, or some other company who serves literally billions of requests each day from thousands of servers, I would worry about this. Otherwise, your scale isn't large enough to make any positive assertions about energy consumption, so any decision you make is just as likely to be counterproductive as it is to be productive because it's impossible to include all the relevant factors.
A relevant example is a few months back when a rumor went around that you could save energy by setting your desktop background to black. The thinking was that black == no light, so you weren't using as much light. Google (one of the few companies with enough power usage to make this kind of research productive) ran some experiments and did some research, and discovered that LCD screens produce white light no matter what, and filter it by passing a second current through the pixels in a different way. So by setting a pixel to black, you are setting its filtration to the maximum, actually using the most energy possible. The most energy-saving desktop background (at least on an LCD screen) is a white background. However, since white backgrounds hurt people's eyes, few people set their desktop backgrounds to white and the rumor that black backgrounds save energy is still prevalent.
So, to make a long story short, worrying about this is likely to do more harm than good.
电源效率本身就是一个完整的领域。测量性能通常是最好的方法(假设硬件相同)。如果要比较不同的硬件,那就完全是“另一场球赛”了。
因此,给定相同的硬件,如果一个软件堆栈可以比另一个软件堆栈执行得更好,那么这意味着性能更好的软件堆栈将比另一个“每个请求”使用更少的功率。如果性能差异足以让您将服务器整合到更少,那么这是一个更大的胜利!
还有很多其他的考虑:
数据中心 考虑到服务器安装在冷却的数据中心中。服务器产生热量,需要去除热量以保护硬件。空调机组没有无限粒度。他们的效率通常伴随着数量。因此,如果我将服务器数量从 2 台减少到 1 台,我可能节省了一台服务器的功耗,但可能不会节省多少冷却成本。但是,如果改变我的架构可以让我减少 100 台服务器……那是一大笔节省!
硬件和外围设备 使用最节能的软件堆栈并在奔腾 4 服务器上运行它 = 愚蠢;)最节能的软件无法弥补低效的硬件。这里的一个有趣的教训是:“让硬件人员担心电源”。您担心将您的应用程序推向市场。当您的应用程序可以产生收入时,您始终可以购买最新的 16 核 Core 5 hexa-deca CPU,并立即获得您的能源效率;)
虚拟化 如果您的应用程序容量较小,将其整合到在多核系统上运行的虚拟机中可能会比在您最节能的软件堆栈中重写它并在独立服务器上运行它节省更多能源。
程序员时间 您需要熟悉“最节能”软件堆栈的程序员。您必须考虑这是否是正确的工具。程序员使用计算机来开发软件,他们需要的开发时间越多(如果他们被限制在错误的工具上),消耗的能量就越多。更不用说你将不得不支付他们更多的时间。这通常会超越任何能源消耗问题,因为这里的成本要高得多。
如果你唯一关心的是能源效率,是的,使用包里的所有工具来帮助你。但大多数时候,这只是整体方案中的一个小变量,也是你成本中最小的一个。
据我了解,许多大公司在数据中心资源需求增长方面遇到困难。这些包括占地面积和功耗。所以我完全可以相信,应用程序的合理化,有利于低资源消耗是一种正在被采用的策略。
是否使用 Java、PHP 或任何其他实现技术可能是功耗的决定因素对我来说不太明显。
如果我们在 Interpreted Basic、Java 和 C 中实现了一个特定的优化资源消耗的函数,我们预计这将需要最多的执行资源。
我需要看到一些确凿的证据,但我可以相信纯解释型语言的消耗量可能超过 Java,甚至使用 JIT 等,它反过来可能消耗的量也可能超过 C。
现在假设(纯粹是假设,我并不是说是这种情况)用 C 开发比用 Java 开发更努力,用 Java 开发比用 Basic 开发更努力。您将如何权衡开发和维护工作与资源消耗?
做起来真的很麻烦。如果有人告诉我他们是基于功耗而转向 Java,我真的很想知道更多。这样做的成本是多少?盈亏平衡点在哪里?[顺便说一句 - 我几乎完全在 Java 中工作,我很想能够说“我们赢了,看看我们的能力有多低!”]
这是一个很难回答的问题,除非正如前面提到的基准,你设置了一些比较规则。
例如,将 Java3D 第一人称射击游戏与 PHP 网页进行比较是不公平的,因为 Java 会失败。
如果您查看 Java 框架,那么您可能想比较这三个:Tomcat + JDK 6 + JSP Apache + PHP Scala + Lift 框架
我包括了 Scala,因为它编译为 java 字节码,我希望它的功耗最低。
我不确定谁会是赢家,我会赌 Scala,但你会想确保你实现了相同的应用程序,然后只比较电源使用情况。
PHP 可能会赢,因为 apache 和 PHP 的内存使用率似乎低于 Java,但我无法真正比较 Scala 和 PHP。
对我来说最大的未知数是,如果你调用相同的 java 代码,那么它已经变成了本地代码,因此运行得更快,但是 JSP 应该被预编译以利用 Java。
但是,如果您使用 Web2.0 技术,那么它会发生变化,因为您将大部分负载放在浏览器上,如果您有一个大型 javascript 应用程序,那么您只是在进行服务器调用,这将减少服务器上的功耗,因为渲染工作被传递到浏览器。到那时,Java 的 JIT 应该发挥作用,而 Java 或 Scala 我预计会降低功耗。
IMO 的一个大测试是看看我们是否可以在减小机器大小时获得相同的性能,因此,如果您需要 3 台用于 PHP 或 Java 的计算机,它们是负载平衡的,而 1 台 Scala 机器可以拥有相同的性能,然后 scala(使用 Lift)将获胜。
这与哪种语言的性能最好是同一个问题。现在,对于大多数程序员接触过的几乎每个项目。到目前为止,您编写系统的方式远远超过使用的技术(假设系统规格正常)。
对于嵌入式系统和科学家来说,语言 wrt 性能的选择是恕我直言。您根据要解决的问题选择语言,很少考虑它的cpu效率。
同样,您设计和编写系统的方式决定了系统的效率。
虽然这里已经深入探讨了与这个问题有关的许多方面,但至少还有一个方面需要研究。
一个典型的 PHP Web 应用程序从一个请求到下一个请求会重复大量工作,这仅仅是因为 PHP 执行环境(或上下文)在请求之间不是持久的。
由于典型的 Java Web 应用程序确实能够直接持久化状态,而无需额外的步骤或缓存失效,因此它不需要执行 PHP 样式的重复 SQL 查询来为每个请求获取相同的信息。相反,Java Web 应用程序通常将当前分析的复杂信息存储在堆上的本机数据结构中,以纳秒而不是毫秒为单位进行访问。
由于处理器执行这些基本数据访问功能所需的工作要少得多,因此每单位客户价值所需的功率也更少。
显然,现代计算技术使用的资源比以前多得多,这直接等同于功耗。一旦我们使用普通的旧套接字通过网络传输二进制数据并由 100Mhz 处理器处理它,现在我们有一个软件堆栈,其中数据被转换为 XML 文本,然后通过同样的 http 通过 web 服务传递插座,我们想知道为什么我们需要一个带有大量 RAM 的 3Ghz 处理器来获得不错的性能:)
所以这就是问题所在,你唯一能做的就是让你的代码更有效率。通常这意味着使用较低级别的语言,并减少对通用框架或库的依赖。如果您无能为力,绝对不要尝试对软件堆栈进行分层。
现代编程不喜欢这样 - 对程序员生产力的推动,雇用更便宜的程序员,并且一直在重新设计代码(即重写它),因此代码需要易于创建(有时还需要维护)。因此,为了获得最佳效果,您需要权衡这些因素。执行此操作的行业标准方法是根据用途简单地混合系统。
目前终极性能是 C/C++ 代码,而终极程序员生产力似乎是脚本语言。因此,两者中最好的方法是用 Python 等脚本语言编写主要业务逻辑,并使用它来调用用 C/C++ 编写的专用“强力助手”。如果您需要更高的性能,您可以在底层 C/C++ 中编写更多代码。如果您需要更多 RAD 快速开发,请使用脚本语言编写更多内容。
我对 OP 的建议是不要用 Java 重写,它可能整体性能更好,但你会花费这么多可能不值得。取而代之的是,利用您的应用程序的密集部分并尽可能高效地重写它们,并从您现有的 PHP 中调用它们。然后看看你的整体架构,减少对低效协议和数据结构的依赖。例如:如果您将 XML 替换为 JSON,您会发现您具有相同的功能,但数据大小和资源只是解析和重新格式化数据所需的一小部分。