java vs php

小编最近经心情不大好,写一篇博文解解闷

在搞清楚java vs php前,我们需要熟悉一些基本概念才能很好的理解下面的对比,否则看了都感觉不知道什么意思

基本概念

1,并发 vs 并行

并发和并行进行区分还是挺简单的,用erlang之父Joe Armstrong画的一张图说明一下:

parallel_vs_concurency

并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,如果前面那个人接好咖啡一直不离开,会导致后面的人都没有咖啡喝.就像程序中一个独享资源被占用,其他线程就处于等待中一样,但是并发通过某种机制,比如时间分片等,规定每个人只能使用咖啡机30秒钟,那么1分钟当中,并发就可以做到2次,所以并发的大小和占用资源的时间是负相关的,资源占用时间短才能够做到高并发

2.吞吐率(Requests per second)

这个比较好理解,每秒能够处理的请求数,越大越好,说白了这个跟发动机功率一样,越大代表性能越强
计算公式:
Request per second = Complete requests / Time taken for tests

3,用户平均请求等待时间Time per request

计算公式:
处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数)
Time per request = Time taken for tests /( Complete requests / Concurrency Level)

4,服务器平均请求等待时间(Time per request: across all concurrent requests)

计算公式:
处理完成所有请求数所花费的时间 / 总请求数
Time taken for / testsComplete requests

php vs java

了解完了上面的这些基本概念,下面我们把PHP和java进行比较,本次实验条件说明(都在小编的电脑上,MacBook Pro Intel Core i7 2.2 GHz memory 16 GB,java和php都没有进行优化,php采用lnmp架构,java采用spring内嵌服务器,都输出一个相同json字符串接口)

对比一
ab -n 100 -c 10 http://192.168.200.299:8080/greeting?name=desheng

item java php
Concurrency Level 10 10
Time taken for tests 0.068 seconds 0.108 seconds
Complete requests 100 100
Failed requests 10 91
Total transferred 15604 bytes 19292 bytes
HTML transferred 3704 bytes 3592 bytes
Requests per second 1477.76 [#/sec] (mean) 922.77 [#/sec] (mean)
Time per request(user) 6.767 [ms] (mean) 10.837 [ms] (mean)
Time per request(server) 0.677 [ms] (mean, across all concurrent requests) 1.084 [ms] (mean, across all concurrent requests)
Transfer rate 225.19 [Kbytes/sec] received 173.85 [Kbytes/sec] received

总结:

  • 从发现Time per request(server)这个指标中,我们可以看出java处理效率比php高,脚本语言不敌伪编译,可以预想的到,如果改成c/c++可能效率提升更加的大
  • 从Requests per second指标中可以看出,java采用的是多线程,php采用的是多进程,java线程可以轻轻松松上千,php只能望洋兴叹了

对比二

ab -n 100 -c 100 http://www.yunying.com/?name=desheng

item java php
Concurrency Level 100 100
Time taken for tests 0.043 seconds 0.130 seconds
Complete requests 100 100
Failed requests 0 90
Total transferred 15700 bytes 19288 bytes
HTML transferred 3800 bytes 3588 bytes
Requests per second 2346.70 [#/sec] (mean) 768.95 [#/sec] (mean)
Time per request(user) 42.613 [ms] (mean) 130.047 [ms] (mean)
Time per request(server) 0.426 [ms] (mean, across all concurrent requests) 1.300 [ms] (mean, across all concurrent requests)
Transfer rate 359.80 [Kbytes/sec] received 144.84 [Kbytes/sec] received

总结:

  • 对比一 vs 对比二中的Time per request(server),java居然越跑越快,php只会越跑越慢,这是因为java开启了JIT,对执行代码进行了优化,但是php没有开启opcahe,所以越来越慢了.
  • 对比Requests per second数据,发现php死活超不了一千的槛,

对比三

ab -n 1000000 -c 1000 http://192.168.200.229:8080/greeting?name=desheng

item java php
Concurrency Level 1000
Time taken for tests 302.511 seconds
Complete requests 1000000
Failed requests 991501
Total transferred 159894503 bytes
HTML transferred 40894503 bytes
Requests per second 3305.66 [#/sec] (mean)
Time per request(user) 30.251 [ms] (mean)
Time per request(server) 0.303 [ms] (mean, across all concurrent requests)
Transfer rate 516.17 [Kbytes/sec] received

总结:

  • java还能跑,但是php已经被压挂了(pr_socket_recv: Connection reset by peer (104)),已经连接不上了

终结:

虽然我很喜欢php简单明了的设计理念,快速并且灵活开发应用,实现功能可以依托大神开发的扩展,但是如果对性能有要求的领域,php就不那么合适了.PHP官网是这么说PHP的:

“PHP is a popular general-purpose scripting language that is especially suited to web development.Fast, flexible and pragmatic, PHP powers everything from your blog to the most popular websites in the world.”

从上面这句话中我们就能感觉到php并没有提到高性能,由此我们彻底的明白了,php面对巨大的编程市场,没有和java一样选择大而全的布局,而是希望有那么一群人,他们希望web编程的成本足够的低,开发的周期足够的短,但是完全能满足日常普通用户的访问需求.就像polo,普通版高尔夫,飞度等车型一样,他只能满足你日常代步的需求,但是你想让他上赛道比赛,输的命运很难改写.所以在创办企业选择编程语言的时候,先看看自己的预算,再看看自己的目标,差不多答案就有了.顺便回答一下facebook为什么用PHP,那是因为facebook刚开始没钱,而且没想到自己有这么火.今天就说到这里吧.时间不早了,洗洗睡吧

文档信息

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文出自 “richardtumas”的博客,请务必保留此

发表日期: 2017年8月11日

邮件: joy@richardtumas.com

One thought on “java vs php

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.