V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whatisnew
V2EX  ›  PHP

今天听人说 php 运算能力不比 java

  •  
  •   whatisnew · 2015-05-28 20:16:11 +08:00 · 10595 次点击
    这是一个创建于 3255 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说是 php 内部使用一个大 hash 表来操作,运算能力比较弱,求证实。

    63 条回复    2015-05-31 22:04:21 +08:00
    thinkif
        1
    thinkif  
       2015-05-28 20:30:28 +08:00
    别听他们瞎说,“PHP是世界上最好的语言” 已经在论坛上达成共识了,不信你搜搜。。。
    whatisnew
        2
    whatisnew  
    OP
       2015-05-28 20:31:31 +08:00
    @thinkif 认真点,我们在这讨论内核呢
    yahoo21cn
        3
    yahoo21cn  
       2015-05-28 20:34:32 +08:00 via Android
    楼主你知罪吗
    silvernoo
        4
    silvernoo  
       2015-05-28 20:35:47 +08:00
    是是是,php是最好的语言。
    whatisnew
        5
    whatisnew  
    OP
       2015-05-28 20:36:43 +08:00
    问题出在 z_val ?
    gamexg
        6
    gamexg  
       2015-05-28 20:42:01 +08:00
    不需要在意这种性能问题吧?
    又不是数据库,堆机器就是。
    whatisnew
        7
    whatisnew  
    OP
       2015-05-28 20:44:44 +08:00
    @gamexg 亲,我们说的是内部实现,比如一个超大n维度的数组或者对象
    feiyuanqiu
        8
    feiyuanqiu  
       2015-05-28 20:59:33 +08:00
    @whatisnew 亲,我看着你的回帖怎么就感觉不靠谱呢,既然你要讨论 php 内核,至少你应该先看看 php 内核是怎么回事吧,
    不然待会巨巨们来了说一大堆干货,又只能看看热闹

    http://www.php-internals.com/book/
    lincanbin
        9
    lincanbin  
       2015-05-28 21:16:57 +08:00
    对的,数值运算方面确实远远不如Java。
    如果系统业务逻辑集中在计算的话建议使用Java,或者用Java做后端,PHP做前端。

    如果不是运算密集型的话就随意了。
    fancy967
        10
    fancy967  
       2015-05-28 21:17:40 +08:00
    @thinkif 你的头像我之前也很喜欢用耶
    endrollex
        11
    endrollex  
       2015-05-28 21:26:20 +08:00
    zts1993
        12
    zts1993  
       2015-05-28 21:33:33 +08:00
    是的,。但是你用PHP做科学运算了么。。
    whatisnew
        13
    whatisnew  
    OP
       2015-05-28 23:36:43 +08:00 via iPhone
    @zts1993 数据统计分析,一些复杂的算法,算不?
    hooluupog
        14
    hooluupog  
       2015-05-28 23:44:32 +08:00
    cpu密集型的运算可是jvm,JIT的强项,一旦虚拟机热起来,跑这种运算超过c/c++也不要感到惊讶。
    est
        15
    est  
       2015-05-28 23:45:53 +08:00
    java内部不是一个大hash表实现的。java内部是一个 AbstractSingletonProxyFactoryBean。再举个例子

    new ServiceExecutionJoinPoint(
    DistributedQueryAnalyzer.forwardQueryResult(
    NotificationSchemaManager.getAbstractSchemaMapper(
    new PublishSubscribeNotificationSchema()).getSchemaProxy().
    executePublishSubscribeQueryPlan(
    NotificationSchema.ALERT,
    new NotificationSchemaPriority(SchemaPriority.MAX_PRIORITY),
    new PublisherMessage(MessageFactory.getAbstractMessage(
    MessageType.WRITTEN,
    new MessageTransport(MessageTransportType.WOUNDED_SURVIVOR),
    new MessageSessionDestination(
    DestinationManager.getNullDestinationForQueryPlan()))),
    DistributedWarMachine.getPartyRoleManager().getRegisteredParties(
    PartyRoleManager.PARTY_KING ||
    PartyRoleManager.PARTY_GENERAL ||
    PartyRoleManager.PARTY_AMBASSADOR)).getQueryResult(),
    PriorityMessageDispatcher.getPriorityDispatchInstance())).
    waitForService();

    唵嘛呢叭咪吽
    xuwenmang
        16
    xuwenmang  
       2015-05-29 07:26:46 +08:00
    一个还没上市的公司,没什么资格谈php优劣。足够你用到亚洲首富的~!
    neo2015
        17
    neo2015  
       2015-05-29 09:01:31 +08:00
    Java做后端,PHP做前端,如今最普遍的选择
    hylent
        18
    hylent  
       2015-05-29 09:06:13 +08:00
    比如一个简单的long类型,与其它类型构成共用体zval_value,再加上类型信息以及引用计数等字段,构成了zval。php肯定要维护其它的一些信息,因此相比原生c代码计算会慢一些。
    不知道lz所谓计算是什么程度的计算。如果觉得计算是你的瓶颈,需要优化的话,可以开发一个php扩展来完成你的计算。扩展开发的话,可以考虑使用zephir,最新master分支支持了的internal function,或许会解决你的问题。
    至于java,不了解啊。
    thinkif
        19
    thinkif  
       2015-05-29 09:11:06 +08:00
    @fancy967
    握爪... 我在很多地方注册的账号都用这个头像呢
    yuankui
        20
    yuankui  
       2015-05-29 09:14:07 +08:00
    如果你用php处理超大n维数组,只能说明你们设计有问题的...
    yuankui
        21
    yuankui  
       2015-05-29 09:14:33 +08:00
    php就读读数据库,渲染渲染html即可..
    aksoft
        22
    aksoft  
       2015-05-29 09:23:07 +08:00
    你用C啊,你怎没不拿C和java比
    hylent
        23
    hylent  
       2015-05-29 09:28:04 +08:00   ❤️ 1
    PHP的数据结构一般都是用HashTable,这一种数据结构涵盖了其它语言的数组、字典、列表等。
    PHP内部在类属性、类方法、变量符号表、全局函数符号表等多处使用了HashTable。
    通过给定键找值,需要计算键的hash值,然后再遍历hash碰撞的情况(如果有)。这样的话就需要一些额外的计算,可能会对效率有影响。

    当然也有Spl系列的数据结构,不过用的不多,不知道效率怎么样。

    应该会有一些专门用于数学计算的库,它们的原理大概就是一个包装器,把php的变量解析出来转化为自己理解的数据类型,然后计算,然后将计算结果包装成php变量返回。这一般对效率不会有太大影响,可以尝试一下。
    jiongjionger
        24
    jiongjionger  
       2015-05-29 09:57:25 +08:00
    PHP的确不适合计算密集型应用。重度计算还要求低延迟的Java也不是很合适啊
    wdlth
        25
    wdlth  
       2015-05-29 10:06:38 +08:00
    大多搞科学计算的还是用Fortran,Intel的编译器、Nvidia的CUDA等都支持,讨论语言的数值运算速度是没有意义的。
    akstrom
        26
    akstrom  
       2015-05-29 10:16:51 +08:00
    数组一直是php的痛阿,何谓"超大n维度的数组或者对象",你考虑过php的感受没有?
    incompatible
        27
    incompatible  
       2015-05-29 10:18:09 +08:00
    @est AbstractSingletonProxyFactoryBean这种名字听起来就跟java语言和jvm没什么关系。
    没猜错的话应该是spring里的东西?
    RisingV
        28
    RisingV  
       2015-05-29 10:36:01 +08:00
    @incompatible spring的东西无疑
    ymdqqqq
        29
    ymdqqqq  
       2015-05-29 14:09:35 +08:00
    PHP确实各种用hash table,但并不是所有东西都用同一个大table啊亲!!!

    至于数值运算、复杂的数据结构、算法实现,请调用现成的库函数或者正则,各种C++实现,性能有保证。

    如果你碰到库函数、正则都解决不了的问题,那多半有现成的工具可以解决。

    如果以上都解决不了你的问题,好吧你至少是几亿PV这个量级的了。。。

    最后再喊一句:PHP是世界最好的语言,不服来战^_^
    LittleMK
        30
    LittleMK  
       2015-05-29 16:43:45 +08:00
    世界上最烂的2种语言有啥好比的
    xiaxiaokang
        31
    xiaxiaokang  
       2015-05-29 16:44:26 +08:00
    @thinkif 听说nodejs是世界最牛逼的语言!
    1etters
        32
    1etters  
       2015-05-29 16:45:11 +08:00
    差很远的
    zhicheng
        33
    zhicheng  
       2015-05-29 16:49:23 +08:00
    天了噜,PHP 哪里来的自信要和 Java 比性能。你是百度出来的吗?
    aliang032
        34
    aliang032  
       2015-05-29 17:42:51 +08:00
    Zend引擎下PHP的运算能力比java差很多,不过HHVM下PHP的运算能力应该不比java差多少
    typcn
        35
    typcn  
       2015-05-29 18:16:40 +08:00
    Java 做表面上 benchmark 吹的多么多么屌
    下载下来不够 100 并发,装逼也得有个限度。

    如果单纯的输出网页 Hello World ,可以准确的告诉你,PHP 快。
    你要是做数学运算,Java 比 PHP 快,然而对于 NVIDIA CUDA 之类的 C 库/硬件计算,还是慢的翔都出来了。
    lvfujun
        36
    lvfujun  
       2015-05-29 18:21:24 +08:00
    @hooluupog 超过c\c++你开玩笑呢么.
    @aliang032 HHVM绝对不会比Java 差哪去.
    stanhou
        37
    stanhou  
       2015-05-29 18:32:00 +08:00
    网站的瓶颈永远在数据库端。这句话要我说几遍。
    hooluupog
        38
    hooluupog  
       2015-05-29 19:26:11 +08:00
    @lvfujun 开没开玩笑,你自己google一下就行。
    msg7086
        39
    msg7086  
       2015-05-29 20:07:01 +08:00
    java的运行速度已经被人笑话很久了
    deepreader
        40
    deepreader  
       2015-05-29 20:13:16 +08:00
    @stanhou https://www.techempower.com/benchmarks/ 虽然在数据库,但是动态语言还是很受伤。。。上java吧
    typcn
        41
    typcn  
       2015-05-29 20:41:00 +08:00
    @deepreader Java 不是动态语言?那是什么?翔?
    deepreader
        42
    deepreader  
       2015-05-29 20:47:16 +08:00
    @typcn Java动态了?求说明求赐教!
    typcn
        43
    typcn  
       2015-05-29 20:50:30 +08:00
    @deepreader 求把 Java 静态编译成可执行文件,我复制到几个不同的系统上跑跑试试?
    rwecho
        44
    rwecho  
       2015-05-29 21:06:02 +08:00
    “PHP是世界上最好的语言”
    yxwqwgz
        45
    yxwqwgz  
       2015-05-29 22:03:56 +08:00
    不知道为什么有人一直拿语言来说事,语言优劣话题挺重要,但是没必要一直挂在嘴上,否则就很无聊。

    我的理解是,“PHP是最好的语言”这句话也没错,任何话都是有语境的,他说这句话的时候,可能还没有ror, Python,Node.js等等,在那个时候,用 PHP 做 Web 方面的开发确实是最好的选择之一,比 Java 什么的方便多了。这个语境就是,1.没有发展出更加先进的 Web 开发模式 2.用于解决 Web 方面的问题。也有可能是表达不够精确的问题,或者是情感上更偏爱这种语言,有时候我们喜欢一个姑娘也会说,这个姑娘是世界上最漂亮的,尽管他知道并不是那样。

    现在大家都把那个语境抽掉,然后就觉得说这句话的人很可笑。

    之所以讲这些,是因为我就曾经有过类似的看法,我想很多选择 PHP 去开发网站的人,也抱有相同的看法:“PHP 是最适合的语言”,否则他们就会选择其他方案了。好像 V2EX 就是用 PHP 开发的吧?即便是在今天,用PHP来开发网站也是个不错的选择。
    deepreader
        46
    deepreader  
       2015-05-29 23:41:44 +08:00
    @typcn Dynamic compilation. 受教了。
    zonghua
        47
    zonghua  
       2015-05-30 00:57:12 +08:00 via iPhone
    @deepreader jsp就是啊
    typcn
        48
    typcn  
       2015-05-30 02:32:10 +08:00 via iPhone
    @deepreader 如果不能编译成 binary,那就是由解释器执行,这还不叫动态?难道运行到半中间能修改代码才叫动态?
    hooluupog
        49
    hooluupog  
       2015-05-30 09:06:06 +08:00
    @typcn 谁说java不能编译成binary的?AOT编译和JIT编译都是编译,java两者皆可。静态和动态语言之分说的是类型系统。关键在于有没有编译时的类型检查。php7,python的type hint做的事情就是添加类型注释,尽管如此,依然不能说是静态类型语言,因为它们添加的类型是可选的,即使不加也能跑起来。但在java里面你试试看能编译通过不。有的语言可以不加类型,但依然属于静态类型语言,比如ML系的,还有一些FP语言,比如haskell,因为它们有全局的类型推到系统,编译器已经帮你做了,不用你手动去写,但依然要做编译期的类型检查。好处就是可以把很多潜在的错误在运行时之前完全消除掉。
    hooluupog
        50
    hooluupog  
       2015-05-30 09:14:29 +08:00
    @typcn 你要的hello world。
    https://www.techempower.com/benchmarks/#section=data-r10&hw=peak&test=plaintext
    java啰嗦也就罢了,性能相比c/c++在某些情况下确实差。
    但什么语言都拿性能来在java面前装B就有点说不过去了。
    thinkif
        51
    thinkif  
       2015-05-30 09:15:41 +08:00
    @xiaxiaokang
    我大 JS 岂能容忍 nodejs 这种番邦自称『语言』...
    typcn
        52
    typcn  
       2015-05-30 09:18:01 +08:00
    @hooluupog 看 benchmark 没有意义,自己下载下来跑一炮
    Roboo
        53
    Roboo  
       2015-05-30 10:10:11 +08:00 via Android
    恭喜LZ成功掀起一场XX大战
    mikale
        54
    mikale  
       2015-05-30 12:14:00 +08:00
    PHP毕竟是最好的语言嘛,别听他们瞎说,PHP的内部实现是非一般的解释器,超越了『编译原理』的一般的规则,绝对是最先进的。LZ要有信心,加油。
    konata
        55
    konata  
       2015-05-30 12:16:47 +08:00
    就像倒数第一说倒数第二的语言运算速度快
    maxsec
        56
    maxsec  
       2015-05-30 12:29:10 +08:00
    程序的效率决定于写程序的人,而不是语言本身
    whatisnew
        57
    whatisnew  
    OP
       2015-05-30 12:41:46 +08:00
    @maxsec 亲,我们说的是底层实现哈
    huijiewei
        58
    huijiewei  
       2015-05-30 14:06:30 +08:00
    运算能力就是比不上

    业界公认的东西,不知道还在讨论个什么劲
    zjqzxc
        59
    zjqzxc  
       2015-05-31 01:18:22 +08:00
    今天听人说 php 写桌面应用不比 C,说是PHP。。。。
    如20,21楼所说,用PHP来做科学运算,,这得跟它有多大仇。PHP用来做网站操作下mysql就挺好,为嘛非得讨论它运算能力呢。是兔子就老老实实在地上跑,还非得跟乌龟比游泳,游泳这事就不是兔子擅长的。从事自己擅长的领域,把不擅长的事儿交给别人吧。
    MrZephyrus
        60
    MrZephyrus  
       2015-05-31 15:06:59 +08:00
    PHP仍然是世界上最好的语言
    hitsmaxft
        61
    hitsmaxft  
       2015-05-31 15:14:52 +08:00
    php 在分配内存这块, 几乎都抽象成 hashtable 的操作, 另外 gc 也相对简单, 所以相对于 java 能够使用堆和非堆之类手段,确实计算速度没法同期比较。

    所以纯 php 语言层面的计算确实比浪费内存有浪费 cpu , 唯一规避的方式就是把这些计算挪到 c 扩展里面, 避开 php 层的封装带来的资源消耗
    incompatible
        62
    incompatible  
       2015-05-31 21:59:07 +08:00
    @typcn 关于“动态语言”,你的理解实在太外行了
    http://www.zhihu.com/question/19918532


    另外"下载下来不够 100 并发,装逼也得有个限度。 "这是在讲笑话吗?
    你做的是什么应用? 是socket服务端?还是基于servlet引擎的web应用?
    是在什么配置的服务器上跑的?给jvm分配了多少堆内存?
    typcn
        63
    typcn  
       2015-05-31 22:04:21 +08:00
    @incompatible 了解了
    前几天看着 play 挺火的,我下载了 play 框架,搭建了一个输出 hello world 的小程序,用 ab 测试,并发简直难以置信
    (跑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2962 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:13 · PVG 23:13 · LAX 08:13 · JFK 11:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.