楼主: 戒网号

C++ vs Java 的一些性能对比

[复制链接]

2

主题

7

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-6-30 12:52:06 | 显示全部楼层
其实C++的就是正常动态分派的性能了, Java和C#这类由于有JIT,在某些情况下会运行时优化动态分派成偏静态的分派甚至内联, JIT的优势就是有这种黑科技在, 当然也会遇到很多分派情况的性能不如C++的.
而C++更相信用户的手动能力,而不是自己搞些优化trick让用户摸不着头脑. 既然分派情况简单, 就应该让用户根据情况自己if或switch分派, 这样才能性能最大化.
回复

使用道具 举报

2

主题

12

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2023-6-30 12:52:43 | 显示全部楼层
可喜可贺,java终于超越c++性能好几倍了。
回复

使用道具 举报

1

主题

5

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-6-30 12:53:17 | 显示全部楼层
switch是分支判断,当然也可能优化成查表。而用虚表和查表其实差不多啊……我觉得如果if/switch快了,那只是内联的原因吧……
还是得看汇编以及profile。
不过我觉得日常使用不用顾及那么多,因为不会有这么多低开销小函数需要设计成虚的……Java大概是因为默认虚方法所以久病成良医?
回复

使用道具 举报

0

主题

7

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-6-30 12:53:26 | 显示全部楼层
因为switch是静态分派,也就可以内联了,减小了函数开销.
回复

使用道具 举报

1

主题

11

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-6-30 12:54:10 | 显示全部楼层
没有全局分析的话,虚表指针的值域未知。所以和 if/switch 相比难优化很多。
JIT 是非常后期的东西,所以做虚调用优化也不足为奇。不过 AOT 也不是不能做虚调用优化。
回复

使用道具 举报

4

主题

9

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-6-30 12:54:29 | 显示全部楼层
这么说应该测测-lto咯
我觉得有那个精力写if/switch了,不如直接上模板算了……
我挺好奇的是,JIT到最后是把main函数给重编译了,还是把虚方法优化到对象实例里去了……
回复

使用道具 举报

2

主题

11

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-6-30 12:55:25 | 显示全部楼层
-lto果然有效, 之前以为链接时优化在单文件编译下没什么效果. 我已经更新了文章. 比较明显的就是第2个测试已经从5.9秒缩短到2秒了.
Java的JIT是分层的, 也就是根据运行次数会调节优化级别, main当然可以动态重编译.
回复

使用道具 举报

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-6-30 12:55:45 | 显示全部楼层
不要乱说, 除了第3个之外都是C++更快, 而第3个测试C++可以进一步手动优化到最快.
回复

使用道具 举报

3

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-6-30 12:56:45 | 显示全部楼层
c++的独特优势是不是可以控制内存布局,然后写出cache-friendly的代码?
回复

使用道具 举报

2

主题

11

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2023-6-30 12:57:28 | 显示全部楼层
除此之外,还有什么优势呢?我是非科班渣渣,说错勿怪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表