为什么苹果新语言 Swift 的 RC4 运算效能是 Python 的 220 倍?
程序员文章站
2022-06-09 11:45:52
...
Swift 是解释型语言吧,真能做到那么快吗,或者210倍只是特殊的某些功能上的速度对比,四则运算应该提升不了这么多吧?
而实际的UI代码中,用户逻辑使用的语言,性能其实无关紧要。因为大部分用户逻辑无非是“当用户操作A发生时改变UI元素BCD的状态”、“从服务器返回结果中提取字段XYZ并设置到对应的UI元素”等等,胶水代码而已。平均每执行一行用户代码,框架代码要执行几百行,这只要在debugger中step into框架代码就能了解。因此只要框架用高效的语言实现,用户代码即使用慢上百倍的Python也无所谓。 Benchmark这个东西,如果没有公布:
1.实际的测试用例
2.各种语言的具体实现
随便怎么吹都可以 Swift 既然是编译到机器码运行的,那就不该和跑在官方解释器上的 Python 比较。
Python 也能编译,用的也是 LLVM。Swift 和这样的 Python 比较才有意义。
包的名字叫 Numba,你在函数上方添一行 decorator,运行的时候就能把这块函数 JIT 编译成机器码。
就题主关心的四则运算来说,举加法的例子,用了 Numba 的 Python 比 C 都快。
这有什么奇怪?!主流编程系统中找比CPython慢的一直都很难 你好意思拿个编译语言跟脚本语言比么? 洗洗睡吧,当然是特定环境下的特定跑分。pypy 跑斐波那契数列就比 cpython 快到不知道哪里去了,线上有几家在用? 忽悠果粉无所不用其极啊
这一次真心鄙视了 swift编译出来的是机器码,python(应该是CPython)编译出来的是python虚拟机运行的字节码。
那么在绝大多数场景下,运行效率肯定是存在巨大差异的。但我觉得210倍这个值是在某个特定的特别能显得swift快的场景下的结论。
其实swift和python的可比性没有那么大,应该和golang比才是真的大丈夫 是可能的,推荐你了解下LLVM这个东西,应该是先编译为一种中间表达,但是随后进一步编译为纯机器码。本质上跟C和ObjC编译出来的没区别,都是汇编机器码,所以效率问题可以忘掉了。
而当你需要即时出结果,就像解释型脚本语言那样时,切换两遍编译为一遍,改输出机器码为输出中间表示给解释器即可。LLVM真的是革命性的东西 图片中的英文,意思是“RC4加密”,这是一种密码级的伪随机数生成算法,主要性能开销,还真就是四则运算。
由此可见,Python的四则运算有多么糟糕。
回复内容:
与提问者的直觉相反,四则运算恰恰是Python(相对于C)最慢的部分。一个整数a+b在Python VM里要经过大约上百行的C代码,其中包括bytecode解释,动态类型带来的间接调用,对bigint的无缝支持等等。要在四则运算上比Python快上百倍,只需要性能不比C差出数量级就可以。这也是各种JIT最喜欢拿四则运算作演示的原因。而实际的UI代码中,用户逻辑使用的语言,性能其实无关紧要。因为大部分用户逻辑无非是“当用户操作A发生时改变UI元素BCD的状态”、“从服务器返回结果中提取字段XYZ并设置到对应的UI元素”等等,胶水代码而已。平均每执行一行用户代码,框架代码要执行几百行,这只要在debugger中step into框架代码就能了解。因此只要框架用高效的语言实现,用户代码即使用慢上百倍的Python也无所谓。 Benchmark这个东西,如果没有公布:
1.实际的测试用例
2.各种语言的具体实现
随便怎么吹都可以 Swift 既然是编译到机器码运行的,那就不该和跑在官方解释器上的 Python 比较。
Python 也能编译,用的也是 LLVM。Swift 和这样的 Python 比较才有意义。
包的名字叫 Numba,你在函数上方添一行 decorator,运行的时候就能把这块函数 JIT 编译成机器码。
就题主关心的四则运算来说,举加法的例子,用了 Numba 的 Python 比 C 都快。
这有什么奇怪?!主流编程系统中找比CPython慢的一直都很难 你好意思拿个编译语言跟脚本语言比么? 洗洗睡吧,当然是特定环境下的特定跑分。pypy 跑斐波那契数列就比 cpython 快到不知道哪里去了,线上有几家在用? 忽悠果粉无所不用其极啊
这一次真心鄙视了 swift编译出来的是机器码,python(应该是CPython)编译出来的是python虚拟机运行的字节码。
那么在绝大多数场景下,运行效率肯定是存在巨大差异的。但我觉得210倍这个值是在某个特定的特别能显得swift快的场景下的结论。
其实swift和python的可比性没有那么大,应该和golang比才是真的大丈夫 是可能的,推荐你了解下LLVM这个东西,应该是先编译为一种中间表达,但是随后进一步编译为纯机器码。本质上跟C和ObjC编译出来的没区别,都是汇编机器码,所以效率问题可以忘掉了。
而当你需要即时出结果,就像解释型脚本语言那样时,切换两遍编译为一遍,改输出机器码为输出中间表示给解释器即可。LLVM真的是革命性的东西 图片中的英文,意思是“RC4加密”,这是一种密码级的伪随机数生成算法,主要性能开销,还真就是四则运算。
由此可见,Python的四则运算有多么糟糕。