从ASP.NET的PHP执行速度比较谈起

上星期我在InfoQ发表了一篇新闻,对Joe
Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结。写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实。当然,如果像某些新闻那样“换一种说法”是可以骗过一些“不明真相的群众”,但是这就有违道德了。因此,在客观陈述完新闻内容之后,我只能选择把自己的感想、评论等内容放在自己的博客上。

过去的几十年间,大量的编程语言被发明、被替换、被修改或组合在一起。每种语言总在争论中诞生,又在进化中消亡。而这些语言的的创造者,无一不是编程世界中的标志性人物,高举探索的旗帜不断前行。敬仰之情促使了这篇文章的诞生,这里收集并分享了这五十年来最成功、最流行的十二门编程语言和它们的创造者的故事。

Joe
Stagner的背景挺特殊,它是PHP的老用户,在ASP.NET出现之前就是PHP的重量级开发人员了。后来不知哪一天开始他加入了微软,我们就可以在一些如介绍ASP.NET
AJAX的文章、视频中看到他。这次他又涉及了一个敏感话题:性能比较。要知道每次这种比较都会惹来一阵争论……我不想用“口水战”来形容,我认为它和“争论”的性质不同。Joe也承认,每次他说PHP好话就会被微软的同事指责,而说.NET好话就要被PHP阵营说是微软的托。

图片 1

我深信优秀的技术人员都是有信仰的,都有技术倾向性。因此如Joe夹在中间的人的确比较尴尬。但是我认为,有信仰,和“客观”是不冲突的。信仰涉及到倾向性,而客观则意味着有倾向性之后的办事方式。

1、Java 的起源

1990 年代初,任职于 Sun 公司的詹姆斯·高斯林等人开始开发 Java
语言的雏形,最初被命名为
Oak,目标设置在家用电器等小型系统的程序语言,应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通讯。由于这些智能化家电的市场需求没有预期的高,
Sun 公司放弃了该项计划。随着 1990 年代互联网的发展, Sun 公司看见 Oak
在互联网上应用的前景,于是改造了 Oak,于1995年5月以 Java
的名称正式发布。Java
伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

与传统型态不同, Sun 公司在推出 Java
时就将其作为开放的技术。全球数以万计的 Java
开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是
Sun
公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同,此外,微软公司后来推出了与之竞争的
.NET 平台以及模仿 Java 的 C#
语言。后来 Sun 公司被甲骨文公司并购,Java 也随之成为甲骨文公司的产品。

Java 的创造是为了完成 WORA(Write once, run anywhere
一次编写到处运行)的理念,它的平台独立性使它在企业应用中获得了巨大成功。到目前为止,它已经成为了最流行的一门应用程序编程语言,被广泛应用于企业级Web应用开发和移动应用开发。

至于比较结果,您可以关注一下新闻内容,总体来说,ASP.NET从纯粹的执行效率上来说是大幅领先于PHP的。这并不令人惊讶,一个是编译为机器码的执行方式,一个是解析执行(即时缓存了op-code也并不是机器码),性能自然天差地远。

2、C++ 的起源

这个构思起源于 Stroustrup 做博士论文时的一些程序撰写经验。他发现 Simula
具备很利于大型软件开发的特点,但 Simula
的运行速度太慢,无法对现实需求发挥功效;BCPL
虽快得多,但它过于低级的特性,使其不适于大型软件的开发。当 Stroustrup
开始在贝尔实验室工作时,他有分析 UNIX
核心关于分布式计算的问题。回想起他的博士论文经验,Stroustrup 开始为 C
语言增强一些类似 Simula 的特点。之所以选择
C,是因为它适于各种用途、快速和可移植性。除了 C 和 Simula
之外,同时也从其它语言中获取灵感,如 ALGOL 68、Ada、CLU 以及
ML。刚开始时,类、派生类、存储类型检查、内联和默认参数特性,都是通过
Cfront 引入 C 语言之中。1985 年 10 月出现了第一个商业化发布。

1983 年,C with Classes 改命名为
C++。加入了新的特性,其中包括虚函数、函数名和运算符重载、参考、常数、用户可控制的自由空间存储区控制、改良的类型检查,以及新的双斜线(//)单行注解风格。1985年,发布第一版《C++程序设计语言》,提供一个重点的语言参考,至此还不是官方标准。1989年,发布了Release
2.0。引入了多重继承、抽象类、静态成员函数、常数成员函数,以及成员保护。1990年,出版了The
Annotated C++ Reference
Manual。这本书后来成为标准化的基础。稍后还引入了模板、异常处理、名字空间、新的强制类型转换,以及布尔类型。

C++ 这个名字是 Rick Mascitti 于 1983 年中所建议的,并于 1983 年 12
月首次使用。更早以前,尚在研究阶段的发展中语言曾被称为“new C”,之后是“C
with Classes”。在计算机科学中,C++ 仍被称为 C
语言的上层结构。它最后得名于 C
语言中的“++”操作符(其对变量的值进行递增)。而且在共同的命名约定中,使用“+”以表示增强的程序。Stroustrup
说:“这个名字象征着源自于C语言变化的自然演进”。C+ 是一个和 C/C++
无关的早期编程语言。

Joe也知道会引发争论,因此他在文章后面写道:

3、ASP.NET 的起源

1997 年时,微软开始针对 ASP
的缺点(尤其是意大利面型的程序开发方法)准备开始一个新项目来开发,当时
ASP.NET 的主要领导人 Scott Guthrie 刚从杜克大学毕业,他和 IIS 团队的
Mark Anders 经理一起合作两个月,开发出了下一代 ASP
技术的原型,这个原型在 1997
年的圣诞节时被发展出来,并给予一个名称:XSP,这个原型产品使用的是 Java
语言。不过它马上就被纳入当时还在开发中的 CLR 平台,Scott
Guthrie事后也认为将这个技术移植到当时的 CLR
平台,确实有很大的风险,但当时的 XSP 团队却是以 CLR
开发应用的第一个团队。

为了将 XSP 移植到 CLR 中,XSP 团队将 XSP 的核心程序全部以 C#
语言重新撰写(在内部的项目代号是 “Project
Cool”,但是当时对公开场合是保密的),并且改名为 ASP+,作为 ASP
技术的后继者,并且也会提供一个简单的移转方法给 ASP 开发人员。ASP+ Beta
版本以及应用在 PDC 2000 中亮相,由 Bill Gates 主讲,由富士通公司展示使用
COBOL 语言撰写 ASP+ 应用程序,并且宣布它可以使用 Visual Basic
.NET、C#、Perl、Nemerle 与
Python 语言来开发。

在 2000 年第二季时,微软正式推动 .NET 策略,ASP+ 也顺理成章的改名为
ASP.NET,经过四年的开发,第一个版本的 ASP.NET 在 2002 年 1 月 5
日亮相(和.NET Framework 1.0),Scott Guthrie
也成为ASP.NET的产品经理(到现在已经开发了数个微软产品,像 ASP.NET AJAX
和 Microsoft Silverlight)。

我知道某些人会被这个测试结果激怒,欢迎发表评论及反对意见,但是如果你无法保持礼貌的话,我会删除你的评论并阻止你的IP。

如果你不喜欢,并拒绝接受这个结果——那么你也来测试一下。用数据支持你的观点,使用我的代码或你自己的,然后围绕事实再来争论

4、PHP 的起源

PHP 原本的简称为 Personal Home
Page,是拉斯姆斯·勒多夫为了要维护个人网页,而用 C 语言开发的一些CGI
工具程序集,来替换原先使用的 Perl
程序。最初这些工具程序用来显示拉斯姆斯·勒多夫的个人履历,以及统计网页流量。他将这些程序和一些窗体解释器集成起来,称为
PHP/FI。PHP/FI
可以和数据库连接,产生简单的动态网页程序。拉斯姆斯·勒多夫在 1995 年 6 月
8 日将 PHP/FI
公开发布,希望可以通过社区来加速程序开发与查找错误。这个发布的版本命名为
PHP 2,已经有今日 PHP 的一些雏型,像是类似 Perl
的变量命名方式、窗体处理功能、以及嵌入到 HTML
中运行的能力。程序语法上也类似
Perl,有较多的限制,不过更简单、更有弹性。

在 1997 年,任职于 Technion IIT
公司的两个以色列程序员:Zeev
Suraski 和 Andi Gutmans,重写了PHP 的语法分析器,成为 PHP 3 的基础,而
PHP 也在这个时候改称为 PHP: Hypertext
Preprocessor.。经过几个月测试,开发团队在 1997 年 11 月发布了 PHP/FI
2,随后就开始 PHP 3 的开放测试,最后在 1998 年 6 月正式发布 PHP 3。Zeev
Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写 PHP 的核心,这个在 1999
年发布的语法分析器称为 Zend Engine,他们也在以色列的 Ramat Gan 成立了
Zend Technologies 来管理 PHP 的开发。

在 2000 年 5 月 22 日,以 Zend Engine 1.0 为基础的 PHP 4 正式发布,2004
年 7 月 13 日则发布了 PHP 5,PHP 5 则使用了第二代的 Zend Engine。PHP
包含了许多新特色,像是强化的面向对象功能、引入 PDO(PHP Data
Objects,一个访问数据库的延伸库)、以及许多性能上的增强。目前 PHP 4
已经不会继续更新,以鼓励用户转移到 PHP 5。

2008 年 PHP 5 成为了 PHP 唯一维护中的稳定版本。现在已经有超过 2000
万个网站和 100
万个Web服务器使用了这门语言,Facebook、Wikipedia、Wordpress 以及 Joomla
这些互联网巨头都在使用它。

自然,Joe也给出了测试代码及测试环境的描述。

5、JavaScript 的起源

最初由 Netscape 的 Brendan Eich 设计。 是甲骨文公司的注册商标。ECMA
国际以 为基础制定了 ECMAScript 标准。
也可以用于其他场合,如服务器端编程。完整的
实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型。

Netscape 在最初将其脚本语言命名为 LiveScript,后来 Netscape 在与 Sun
合作之后将其改名为 。 最初受 Java
启发而开始设计的,目的之一就是“看上去像
Java”,因此语法上有类似之处,一些名称和命名规范也借自 Java。但
的主要设计原则源自 Self 和 Scheme。 与 Java 名称上的近似,是当时
Netscape 为了营销考虑与 Sun
微系统达成协议的结果。为了取得技术优势,微软推出了 JScript 来迎战
的脚本语言。为了互用性,Ecma 国际(前身为欧洲计算机制造商协会)创建了
ECMA-262 标准(ECMAScript)。两者都属于 ECMAScript 的实现。尽管
作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是
具有非常丰富的特性。

文章的评论自然是很有看头的,说法很多,有许多人说VS的IDE好,有人说PHP永远只能写出半专业的程序。Joe一一进行了回应,我个人认为回应的还是很客观的,紧紧围绕在测试的中心。他表示,虽然VS非常优秀,但是PHP也有很好的IDE。而能否写出专业的程序是看人,而不是由PHP决定的,有丑陋的PHP程序,也能写出如C++一般工整美观的代码。

6、「红宝石」语言的起源

1993年,松本行弘开始 Ruby
语言的研发工作,试图集成脚本语言中最好的特点,基于 C 语言开发,但比 Perl
更强大,比 Python 更面向对象。1994 年,松本行弘独立完成 Ruby 的第一个
Alpha 版,那年他才28岁。松本行弘把它取名
Ruby,也因这名字是一种美丽珍贵的红宝石之意。Ruby
本身也极具魅力——这种解释型脚本语言,既有脚本语言强大的字符串处理能力和正则表达式,又不失解释型语言的动态性。

此外,松本行弘还借鉴了 Perl 语言在文字处理方面的优势,由 Ruby
编写的程序不需事先编译即可直接运行,因此利于实现开发过程中的快速反馈,极大地方便了程序的调试。1995
年 Ruby
脚本语言的第一个版本发布后,因其大大提高了开发者的工作效率,让编程更有乐趣,很快在日本非常流行。

1997 年开始,松本行弘在“株式会社 Network
应用通信研究所”担任特别研究员,专注于 Ruby 的开发。2000年,Dave Thomas
首次将这 Ruby 介绍到了英文社区,很快掀起了 Ruby 语言的热潮。Ruby
的灵活特性给动态编程语言注入了新的活力,逐渐获得全世界范围的程序设计者的喜爱。

世界上没有一种完美的语言,Ruby 也一样。尽管 Ruby
很棒,但很多人还是觉得他的性能效率较低。不过好在后来开发者也通过一些扩展来弥补
Ruby 的瓶颈。2004年,丹麦人 David Heinemeier Hansson 用 Ruby
语言开发的一种 Web 框架 Ruby on
Rails,可达到 J2EE
开发速度的 10 倍以上,被很多人视为“软件开发的银弹”,Ruby
开始在全球范围内流行。

从表面上看,ASP.NET在性能上胜出PHP一大截,作为ASP.NET的忠实用户我应该非常乐意接受这个“结果”。但是,我并不关注这个,因为这种运行时上纯粹的速度对于一个Web应用程序来说实在微不足道。例如Joe的第三篇文章里列举出的PHP高手的应对方式:

7、Scala 的起源

Scala 是一门多范式的编程语言,一种类似 Java
的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。

2001 年,洛桑联邦理工学院的马丁·奥德斯基开始基于 Funnel 的工作开始设计
Scala。Funnel 是把函数式编程思想和佩特里网相结合的一种编程语言。
奥德斯基之前工作于 Generic Java 和 javac。Java 平台的Scala 于 2003 年底/
2004 年初发布。.NET 平台的 Scala 发布于 2004 年 6
月。该语言第二个版本,v2.0,发布于 2006 年 3 月。2009 年 4 月,Twitter
宣布他们已经把大部分后端程序从 Ruby
迁移到Scala,其余部分也打算要迁移。此外, Wattzon
已经公开宣称,其整个平台都已经是基于 Scala 基础设施编写的。

2014 年,马丁·奥德斯基宣布 Scala 2.12 将要简化语法,推出 Scala “Don
Giovanni” 项目的时候,表示:“Scala
现在是为聪明人创造的,以后也是为聪明人服务的。” 不同于 Python
让程序员用一种方法做所有事情,Scala
提供一整套工具,让程序员自由选择,无论是 mutable 数据结构,immutable
数据结构,并行(parallel)数据结构。然后在这些选择中,Scala
再针对他们进行算法层面的特殊优化。Scala
相信程序员的聪明才智,让程序员自行选择合适的结构,以针对变化万千的任务需求,这点是
Scala 做得好的地方。

  • ASP.NET在性能上的领先不会对我有什么影响。PHP是我的最爱,我的应用程序已经足够快了。
  • 没错,ASP.NET在基础性能上是比较快,但是我的应用程序可以通过优秀的页面实现和JavaScript实践把这部分性能补回来。
  • 我在进行Drupal开发,我对PHP最熟悉,因此我宁愿多花一些硬件来保持更好的开发效率。

8、Python 的起源

1989
年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为
ABC 语言的一种继承。之所以选中 Python 作为程序的名字,是因为他是 BBC
电视剧——蒙提·派森的飞行马戏团(Monty Python’s Flying
Circus)的爱好者。ABC
是由吉多参加设计的一种教学语言。就吉多本人看来,ABC
这种语言非常优美和强大,是专门为非专业程序员设计的。但是 ABC
语言并没有成功,究其原因,吉多认为是非开放造成的。吉多决心在 Python
中避免这一错误,并获取了非常好的效果,完美结合了 C 和其他一些语言。

就这样,Python 在吉多手中诞生了。实际上,第一个实现是在 Mac
机上。可以说,Python 是从 ABC 发展起来,主要受到了
Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了
Unix shell 和C 的习惯。目前吉多仍然是 Python 的主要开发者,决定整个
Python 语言的发展方向。Python
社区经常称呼他是仁慈的独裁者(BDFL),意思是他仍然关注 Python
的开发进程,并在必要的时刻做出决定。

Python 的设计哲学是“优雅”、“明确”、“简单”。Python
开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计 Python
语言时,如果面临多种选择,Python
开发者一般会拒绝花俏的语法,而选择明确没有或者很少有歧义的语法。这些准则被称为“Python
格言”。

以及InfoQ上的一条评论:

9、Go 的起源

Go,又称 golang,是 Google
开发的一种静态强类型、编译型,并发型,并具有垃圾回收功能的编程语言。

罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于 2007 年 9 月开始设计
Go 语言,稍后 Ian Lance Taylor, Russ Cox 加入项目中。谷歌把 Go 作为一个
20% 项目开始研发,即让员工抽出本职工作之外时间的 20%,
投入在该项目上。除了派克外,该项目的成员还有其他谷歌工程师也参与研发。对于开发这门语言的起因,派克说:我们之所以开发
Go,是因为过去 10 多年间软件开发的难度令人沮丧。

Go 语言是基于 Inferno 操作系统所开发的。Go 语言于 2009 年 11
月正式宣布推出,成为开放源代码项目,并在 Linux 及 MacOS X
平台上进行了实现,后追加 Windows 系统下的实现。2010 年 1 月 10 日,Go
语言摘得了 TIOBE 公布的 2009 年年度大奖,该奖项授予在 2009
年市场份额增长最多的编程语言

在WEB上便捷的开发,与各种系统之间灵活的搭配,像胶水一样将各种不同的物件拼装起来呈现给Web,(python在这方面也做得非常棒)。这才是PHP能有今天的本质原因。

10、Android 的起源

2003 年 10 月,安迪·鲁宾(Andy Rubin)在美国创建了 Android
科技公司(Android Inc.),并与利奇·米纳尔(Rich
Miner)、尼克·席尔斯(Nick Sears)、克里斯·怀特(Chris
White)共同发展这家公司。Android 系统最初由安迪·鲁宾(Andy
Rubin)等人开发制作,最初开发这个系统的目的是创建一个数码相机的先进操作系统,但是后来发现市场需求不够大,加上智能手机市场快速成长,于是
Android 被改造为一款面向智能手机的操作系统。谈到创建 Android
科技公司的原因,鲁宾说:“聪明的移动设备能更好的意识到用户的爱好和要求。”尽管
Android 科技公司的创始人和员工过去都具有各自的科技成就,但是 Android
科技公司的经营只显露出它在智能手机软件的方面,这时鲁宾为 Android
科技公司花光所有钱。

2005 年 8 月 17 日,Google 低调收购了成立仅 22 个月的高科技企业 Android
及其团队。安迪鲁宾成为Google 公司工程部副总裁,继续负责 Android
项目。2007 年 11 月 5 日,谷歌公司正式向外界展示了这款名为 Android
的操作系统,并且在这天谷歌宣布建立一个全球性的联盟组织,该组织由34家手机制造商、软件开发商、电信运营商以及芯片制造商共同组成,并与
84 家硬件制造商、软件开发商及电信营运商组成开放手持设备联盟(Open
Handset Alliance)来共同研发改良 Android 系统。

2013 年 09 月 24 日谷歌开发的操作系统 Android 迎来了 5
岁生日,全世界采用这款系统的设备数量已经达到 10 亿台。

之前我批评Java是一种不思进取的低生产力语言,回应很多。其中也有类似的说法,如说Java平台上开源多,项目多等等。没错,这我在对Java语言发起非难之前就已经反复强调了。我同意这个观点——但是,如果是这样的“结论”肯定是站不住脚的:“因为Java平台开源多,项目多,因此Java语言并不是不思进取的语言”。这就好比有人说“他熟悉PHP,PHP的项目多,因此PHP的性能比ASP.NET快”一样,把两种东西混淆起来了。

11、Swift 的起源

2010 年 7 月,苹果开发者工具部门总监克里斯·拉特纳开始着手 Swift
编程语言的设计工作,以一年时间,完成基本架构后,他领导了一个设计团队大力参与其中。Swift
大约历经4年的开发期,2014 年 6 月发表。

苹果宣称 Swift
的特点是:快速、现代、安全、互动,而且明显优于
Objective-C 语言。Swift 以 LLVM 编译,可以使用现有的 Cocoa 和 Cocoa
Touch 框架。Xcode Playgrounds 功能是 Swift
为苹果开发工具带来的最大创新,该功能提供强大的互动效果,能让 Swift
源代码在撰写过程中能即时显示出其运行结果。拉特纳本人强调,Playgrounds
很大程度是受到布雷特·维克多(Bret Victor)理念的启发。

2015 年 6 月 8 日,苹果于 WWDC 2015 上宣布,Swift
将开放源代码,包括编译器和标准库。

2015 年 12 月 3 日,苹果宣布开源 Swift,并支持 Linux,苹果在新网站
swift.org 和托管网站 Github 上开源了 Swift,但苹果的 app store
并不支持开源的 Swift,只支持苹果官方的 Swift 版本,官方版本会在新网站
swift.org 上定期与开源版本同步。

奇怪的是,Joe没有让人不要用PHP,我也没有让人不要用Java平台(不过我现在一直建议别人用Scala代替Java语言)。

12、Node.js 的起源

Node.js 由 Ryan Dahl 和一些其他的开发者于2009年在 Joyent
工作时发明。Node.js 在2009年初次发布于Linux。 开发和维护工作由 Dahl
主持,其工作单位 Joyent 同时赞助这些工作。

Dahl 设计 Node.js 的灵感来自于 Flickr
上的一款上传进度栏,浏览器并不清楚多少文件内容已被上传,除非向服务器进行查询。Dahl
于是设计了一个更简便的方法。这个集成了 Google V8 JavaScript
引擎和一个底层 I/O API 的项目由 Dahl 在 inaugural European JSConf
向公众进行展示。

Node.js 已经有数十万模块,它们可以通过一个名为 npm 的管理器免费下载。

本文系
OneAPM
工程师整理呈现。OneAPM
能为您提供端到端的应用性能解决方案,我们支持所有常见的框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,性能监控从来没有如此简单。想阅读更多技术文章,请访问
OneAPM
官方技术博客

本文转自 OneAPM 官方博客

许多国内技术人员总有这样的“毛病”,见不得自己使用东西有一点点“瑕疵”。既然我是Java平台开发人员,我使用Java语言,我就见不得别人说Java语言一丁点不好。其实做技术就是做权衡,“没有银弹”就意味着没有技术是完美无缺的,我们选择技术是在优势和劣势之间进行平衡后的结果。只有承认了缺点,认识到缺点,才能吸取其他技术的长处,来作出更好的权衡。

因此我一直认可的是,SQL
Server的确贵,数据存储就用*nix平台上的吧。选择多,性能多。

相关文章