php 的 jit 真的要来了

2016-12-13 22:04:05 +08:00
 gouchaoer
来源:
https://www.oschina.net/question/2896879_2212316

jit 能在 php7.2 放出来么?
以及鸟哥委婉的吐槽了 Laravel ,还有很多干货,说到心坎里去了。
15929 次点击
所在节点    PHP
83 条回复
Jakesoft
2016-12-14 12:38:41 +08:00
我喜欢的
乐队是 muse, pulp,他们在国内
都不火
亦如我写代码用
php,它也不是世界上
最好的语言
可是有什么能挡住
我对生活
的热情呢?
quericy
2016-12-14 12:52:36 +08:00
PHP 最初的设计如何并没有关联吧,每个语言都是在发展的,互联网的环境也是在变的.PHP 最初设计的时候,互联网的规模和并发数和现在能比么?语言随着时代的变化而跟进有什么不妥?

就如同加入可选的类型系统,可以让 PHP 开发者更加没有选择 Hack 的理由一样,
当 PHP 的业务大到需要 JIT 优化性能的时候,如果这个时候 PHP 已经有了 JIT,公司还有什么理由付出重构的成本来切到 Java?
quericy
2016-12-14 12:53:02 +08:00
@q397064399 PHP 最初的设计如何并没有关联吧,每个语言都是在发展的,互联网的环境也是在变的.PHP 最初设计的时候,互联网的规模和并发数和现在能比么?语言随着时代的变化而跟进有什么不妥?

就如同加入可选的类型系统,可以让 PHP 开发者更加没有选择 Hack 的理由一样,
当 PHP 的业务大到需要 JIT 优化性能的时候,如果这个时候 PHP 已经有了 JIT,公司还有什么理由付出重构的成本来切到 Java?
sumuu
2016-12-14 13:01:52 +08:00
```
某女:你能让这个论坛的人都吵起来,我今晚就跟你走。
某软件工程师: PHP 是最好的语言!
某论坛真的就炸锅了,各种吵架……
某女:服了你了,我们走吧,你想干啥都行。
某软件工程师:今天不行,我一定要说服他们, PHP 必须是最好的语言……

```

还是这个笑话!
gouchaoer
2016-12-14 13:12:23 +08:00
@Actrace 我用 php-cli 循环 3400w 次往 redis 里面插数据,内存泄露退出过,不知道是第三方库的锅还是扩展的锅。。。。我基本上也是写 php-cli ,别的情况下 php-cli 倒是很稳定,我 win 下 php-cli 几个月的跑也没问题。。。链表你是说 array 么?这个是基本数据结构不会有问题的
Actrace
2016-12-14 15:31:47 +08:00
@gouchaoer
不是指 Array 类型的实现。按照之前看的鸟哥关于 PHP 源码对动态数据类型实现的一些介绍, Hashtable 会自动做扩张处理,但是有没有回缩就不知道了。即使不存储数据,空的 Hashtable 也会占用不少的数据,特别是大量创建并销毁变量的情况下。
因为之前写过的 CLI 业务程序占用过高达 GB 级的内存,所以对这个现象比较在意(虽然后来也是通过重启进程来释放资源)。

PHP 编写的 CLI 程序其实本质上和 C 写的程序并没有区别。稳定性也不用担心。

主要是第三方扩展是一个很大的不确定因素,特别是之前用 pthreads 库,各种退出。现在基本不考虑第三方扩展了。
ids
2016-12-14 15:48:33 +08:00
gouchaoer
2016-12-14 15:49:32 +08:00
@Actrace GB 绝对是内存泄漏(第三方扩展泄漏,第三方库泄漏,或者你自己存了变量没释放),第三方扩展也分稳定和不稳定的, krakjoe 维护的 apc 、 pthreads 都是那种不稳定的,没必要一刀切
Actrace
2016-12-14 16:00:04 +08:00
@gouchaoer 额,泄露不是内存占用大的主因。一部分内容(比较大的数据)确实是需要存入内存。我的意思是在频繁创建并销毁变量之后,用于存储这些变量的 Hashtable 只扩张不收缩(猜测),结果是即使销毁了这些变量也没有彻底回收掉消费的内存。

另外 curl 的内存泄漏也是一个坑,直到现在还没修。
Dlad
2016-12-14 16:03:23 +08:00
论性能,我查到的 benchmark 都证明 PHP 干不过 JAVA.
不过目前这个阶段, WEB 领域, JAVA 能干的 PHP 也都能干。

淘宝的案例,只看当下,蜻蜓点水说那么两句,这是孤立的看问题,没有触及实质。
淘宝的技术栈选择,跟其业务规模发展密不可分,是个螺旋上升的过程。

我前几个月写了一篇文章,论证了为什么说 PHP 目前还是一门有生命力的语言:
https://wobu2.com/2016/05/09/php-is-not-the-best-language-md/
gouchaoer
2016-12-14 16:23:56 +08:00
@Actrace 每个 array 或者 object 变量都是单独的 hashtable ,变量超出作用域了肯定回收了,所以说你的猜测是不存在的。加载了大量 object 情况下内存变大是很正常的,比如 composer 安装一个库动则几百 M 上 G 。

至于 curl 扩展内存泄漏,我用的 Guzzle ,底层包装的就是 libcurl 扩展,我每个 php 进程会发起几千上万次 http 请求我并没有观测到泄漏,所以你如果观测到泄漏把代码样本贴出来,不可能不修的
sagaxu
2016-12-14 18:06:27 +08:00
@gouchaoer 5.3 以前的 php 没有 gc ,所以循环引用会导致内存泄露, 5.3 之后,没关闭 gc 的话,合适的时机会释放内存的,不过也不保证短时间内触发,跟 java 一样,系统决定该不该触发。加上 php 很多扩展都是 C 写的,质量也良莠不齐, cli 模式下有泄露也是很常见的,不像 Java 那样可控。
gouchaoer
2016-12-14 18:34:12 +08:00
@sagaxu php 的垃圾回收指的是检测循环引用的那个算法, php 本质上还是基于计数引用的简单垃圾回收,这和 jvm 不太一样。。。而且触发条件也很明确,性能在非极端情况下影响不大: http://m.weibo.cn/1170999921/3783767585644423?sourceType=sms&from=1067295010&wm=2468_1001
sagaxu
2016-12-14 19:23:51 +08:00
@gouchaoer 本质上没什么不同,都是系统自身决定是否需要来一发 gc ,正常代码逻辑中,无法准确预测下一发 gc 什么时候发生。细抠的话,光 oracle 一种 jvm 就有 4 种常用 gc ,每种 gc 又有参数控制和运行时环境输入值。从功能和成熟度比较, php 的 gc 只是个小玩具。
solaro
2016-12-15 09:43:46 +08:00
啧啧啧,
@setonfocus 给你点赞,什么东西到我大天朝,都得变样。我大天朝就是新技术的试验田。
jsq2627
2016-12-15 14:24:03 +08:00
有点惊讶 php 竟然还没有 jit
gouchaoer
2016-12-15 14:44:52 +08:00
@jsq2627 php 的 jit 在 5.x 时代就做了尝试,虽然在 cpu 密集 benchmark 上提高巨大,但是在 wordpress 之类的真实场景下看不到提升,所以一直没并入分支,这次是真实观察到提升后的结果。。。
ericgui
2016-12-16 00:28:15 +08:00
@q397064399 估计上 JIT 是为了和 HHVM 竞争。
mingyun
2016-12-17 22:29:21 +08:00
laravel 多优雅
huigeer
2016-12-19 19:17:54 +08:00
php7.2 的 opcache 扩展还用不了啊, 用不了 jit

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327441

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX