为什么计算机语言会有性能的差异?

2016-01-06 16:29:43 +08:00
 temberature
8683 次点击
所在节点    程序员
86 条回复
acros
2016-01-06 18:33:51 +08:00
c , c++能直接操作内存,手动管理分配,比 gc 效率不知道高到哪里去了。 啊,出问题的时候,你也不知道自己死到哪里去了。
h4x3rotab
2016-01-06 19:03:01 +08:00
最大的锅其实是 gc ,别的都还好说
qian19876025
2016-01-06 19:15:09 +08:00
@temberature 你说的是 MIT 那群人搞的什么在已有可执行的软件上 自动生成新软件?
不过你说的那种 怕是 说的机器人能听懂你的语言 然后 机器人执行你的命令
真到那个时候 还要毛线程序员啊 到那时候直接都是一群肥猪
jsyangwenjie
2016-01-06 19:41:08 +08:00
你是要语言的表达能力呢,还是要其性能呢(当然这跟编译器实现有关),还是要安全呢?
Devin
2016-01-06 19:42:49 +08:00
@wy315700 看了这么久,感觉这个最合理😂
gamexg
2016-01-06 19:46:36 +08:00
动态类型需要检查类型。
静态语言垃圾回收之类的也会消耗性能。
还有很多安全检查,例如 null 指针。
YuJianrong
2016-01-06 21:22:08 +08:00
我觉得这个提法本身就是错误的。

对于编译(以及有 JIT 的语言比如 java/JS )语言来说,语言没有性能区别,只有功能区别,所谓性能区别是因为功能不一样,那跑的机器码当然不一样,性能就不一样了。
所以如果功能完全一样, C 和 java 的代码性能也是一样的(比如最基础的一些整数加减计算, JIT 出来的 java 也不可能跑得慢),但问题就是很多功能其实是不一样的。比如 C 的字符串处理,就是处理 8bit 的 char 数组而已,然而 java 的字符串处理,就是处理有这边界保护等等复杂逻辑的一个数据对象,性能自然不可能一样。

提到 web 领域的话,微博领域也有高性能计算解决方案,就是 mozilla 提出的 asm.js ,在 js 中加入一些兼容的修饰之后,就可以让 JIT 将这种 JS 编译为性能更好的机器码,现在已经得到很多浏览器的广泛支持。在这个之外,还有 intel 提出的 SIMD.js 扩展,可以使 JS 能利用并行指令集来加速计算,不过貌似并没有得到广泛支持。

Asm.js 的下一步是 webAssembly ,就是 JS 运行时代码的二进制表达,可以在封装上也达到类似原生的代码和解析效率。
temberature
2016-01-06 21:47:29 +08:00
@qian19876025 可是要做什么是机器决定不了的,成了大头娃娃倒是有可能,哈哈...
temberature
2016-01-06 21:49:19 +08:00
@YuJianrong 有时间仔细看看你说的
msg7086
2016-01-06 23:12:25 +08:00
#36 @temberature 是可以提升。
世界上可以提升的东西有很多很多。
有很多人还在贫困线上挣扎,吃不饱穿不暖,朝不保夕。
如果真的有什么东西急着要提升的,那就提升下他们的生活质量吧。
相比起来一个语言的运算性能算什么。

反过来说,如果一个语言的性能已经能够接受了,那么再榨取空间无非只是锦上添花。
就说 JavaScript ,在 V8 引擎出现之前, JS 的运行效率并不高,然而 JS 也活了那么多年了。
现在性能高了,无非也就是锦上添花,跑些 SPA 跑些好看的效果,并没有实质性地改变人的生活。

至于像 PHP 这样的,如果没有那么高的性能会怎么样呢?
其实也不会怎么样。十多年前 PHP4.x 时代照样一大批论坛在跑啊,照样造就了很多高质量的网站啊。
无非就是多花点钱而已。
能用一点小钱就能解决的问题,都不算是问题。
多买一台服务器撑死也就一两千刀。
优化一个语言的性能,成本轻松就可以超过一百万刀。
不是一个数量级上的东西。
temberature
2016-01-06 23:34:54 +08:00
@msg7086 你说的没错,但有些不同意见,对于不同对象算法不一样,比如 v8 和 hhvm ,对于 google 和 facebook 来说,改进基础设施的回报就比只花钱划算,再比如一个压缩算法会在全世界减少多少储存成本,基础研究从来都是算大帐,也许我较真了,只想说明这个问题的意义。 ps:突然想起一篇文章,非洲那么多挨饿的人,为什么不拿探索太空的钱帮助他们?
msg7086
2016-01-06 23:39:53 +08:00
@temberature 是的,所以是否要去改进一个语言,应当是成本导向而不是仅仅因为某个语言很慢。
创业公司偏向于 Ruby 和 Python 之类的语言,纯粹就是因为他们给企业节约了大量的成本,减少了开发周期,提高了可维护性,便于后期继续发展。
但是一旦到了某个瓶颈阶段,改进语言比买服务器便宜的时候,才会再去花大力气改进语言本身。

PS: 压缩算法其实快到头了,再挖掘下去意义已经不是辣么大了。要减少存储成本不如减少存储器的成本。
RqPS6rhmP3Nyn3Tm
2016-01-07 00:02:16 +08:00
@KyleMeow 三者之间有什么不同呢?
imgalaxy
2016-01-07 02:02:38 +08:00
别说计算机语言了…
人说话不也是一样的么
Perry
2016-01-07 02:44:27 +08:00
把这个世界都想的太简单。
KyleMeow
2016-01-07 09:34:12 +08:00
@BXIA 翻译( translate )指的是两种同等级语言之间的保持逻辑结构的等价转换,比如 C++ 翻译为 Java ,保持原有的函数结构和逻辑,可以无损地转换回来,正如英语中 translate 还有平移的意思;编译( compile )是高级语言转为低级语言(不一定是汇编,只要有损、降级就是编译),这个过程不可逆,比如说汇编就难以恢复为原来高级语言的代码结构;解释( interpret )则是在运行时将高级语言解释为一句一句的机器指令并执行。

不过现在很多语言都是混合的,既有翻译也有编译还有解释。
Zero24
2016-01-07 10:18:35 +08:00
开发效率 vs 性能
abxialiang
2016-01-07 10:29:05 +08:00
假设汇编是最底层语言,拿 c 和 c#来对比,你的意思是实现同样的功能,c 和 c#应该可以编译出同样的汇编代码,那样运行性能就一样了是吧,实际上很困难,因为机器和人脑的运行方式有很大的区别,高级的语言更接近人脑的思维方式,但付出的代价是用了很多额外的逻辑来将机器尽量模拟成人脑,语言越高级,这种额外的逻辑就越多,而这些额外的逻辑最终"编译"进了汇编代码,为什么编译器不能在在编译时把这些"额外的逻辑"去掉只保留核心汇编代码呢?简单的也许可以,像代码 1+2+...n,有些编译器直接转化为数学公式(1+n)*n/2 进行计算了,复杂点的无法那么智能的去掉了,往往一个项目中复杂的东西比较多.编译器就是个翻译器,在翻译成汇编时如果太"智能",自以为是的抽取核心思想,指不定把不该去掉的东西去掉了,还是直译稳妥,毕竟人脑的思想还太过深邃.

~~这些是我个人的一些想法,说的不恰当的地方请多包涵.
GentleSadness
2016-01-07 13:58:55 +08:00
语言性质问题、、函数式的惰性求值导致内存占用高,但命令式的求值导致 CPU 浪费,侧重点什么的,还有静态和动态的,什么鬼都有,抽象层次的不同,侧重点的不同导致性能的差异
standin000
2016-01-07 14:08:23 +08:00
@temberature 斧头和剑砍人的效果不会一样的。

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

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

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

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

© 2021 V2EX