V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
MonkLuf
V2EX  ›  问与答

算 1 到 10 亿的所有自然数的和,c 用时 4.4's, java 用时 3.8's,python 用时 302.9's,已吓尿,求解释

  •  
  •   MonkLuf · 2014-10-18 16:37:36 +08:00 · 12921 次点击
    这是一个创建于 3693 天前的主题,其中的信息可能已经有所发展或是发生改变。
    算1到10亿的所有自然数的和,c用时4.4's, java用时3.8's,python用时302.9's。

    吓尿!!!

    java居然这么快,居然比c都快!!python居然慢了将近100倍也太夸张了吧!!这个速度突然毁掉了我的世界观。。。。。

    求懂java的人带详细理由的告诉我为什么java会这么快,python为何慢这么多(慢得太离谱了。。。)
    106 条回复    2014-10-20 10:10:04 +08:00
    1  2  
    ChanneW
        101
    ChanneW  
       2014-10-19 22:30:08 +08:00
    凑热闹, 程序不变, 执行结果如下:

    ./plus.bin
    sum: 500000000500000000, time used: 2.820283 s

    python plus.py
    sum : 500000000500000000 , use time : 83 s

    pypy plus.py
    sum : 500000000500000000 , use time : 1 s

    java plus
    sum :500000000500000000 , use time : 0.871000 s
    ChanneW
        102
    ChanneW  
       2014-10-19 22:32:10 +08:00
    pypy 的结果还是让人很欣慰的, 这些年没白搞啊. 速度差不多, 统计方法不精确.
    ChanneW
        103
    ChanneW  
       2014-10-19 22:55:54 +08:00
    没人看一眼 ruby 么?

    ruby plus.rb
    sum : 50000005000000 , use time : 0.370955077
    ChanneW
        104
    ChanneW  
       2014-10-19 22:59:08 +08:00
    汗, 打错了 , 吓人

    ruby plus.rb
    sum : 500000000500000000 , use time : 37.145211624
    msg7086
        105
    msg7086  
       2014-10-20 07:09:25 +08:00   ❤️ 1
    @lushl9301 对于完全没有优化代码,你说的基本正确。
    从汇编角度来说,数字存储在内存中,要加一的时候,先要从内存里mov到寄存器,然后复制一份寄存器数据,把原始寄存器里的值add常数1,然后再mov回内存,最后返回拷贝寄存器里的值。

    比如
    mov ecx, DWORD PTR [ESI]
    mov eax, ecx
    add ecx, 1 # or # inc ecx
    mov DWORD PTR [ESI], ecx

    但是如果加上了哪怕一点点优化,就会变成
    # ecx contains variable i
    inc ecx

    这已经是一个数量级的优化了。
    ToughGuy
        106
    ToughGuy  
       2014-10-20 10:10:04 +08:00
    ~# time python -c 'sum(xrange(1, 1000000001))'

    real 0m5.378s
    user 0m5.382s
    sys 0m0.000s

    ~# time pypy -c 'sum(xrange(1, 1000000001))'

    real 0m0.873s
    user 0m0.865s
    sys 0m0.008s

    用内建函数计算也差不到哪里去吧。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:21 · PVG 23:21 · LAX 07:21 · JFK 10:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.