Ph-苯
本帖最后由 Ph-苯 于 2022-12-9 13:52 编辑

书接上回:暗地里到底没了多少?🧐

大雾

Kotlin (JVM):
控制台输出:280

C++:
控制台输出:2379

经群友提醒,在C++用内联再试了一遍:
控制台输出:1397

经群友和坛友提醒,对第二版C++代码开启O2优化,结果控制台输出变成0了……把循环次数改成0xffffffffffffffff,输出还是0。把第一版C++代码启用O2优化,循环次数也改成0xffffffffffffffff,输出也变成0了。我怀疑这部分代码直接被优化没了。
刚刚发现C++我写的赋值运算符函数是错的,导致其没有赋值。我把x和y都改成非const,并使用默认的赋值运算符函数:
不开O2优化,控制台输出:2484
开O2优化,控制台输出:0
不出所料,O2优化把无副作用的循环给优化掉了……
我把主函数改成这样:
控制台输出第一行:23
O2优化果然了得。

src_resources
本帖最后由 src_resources 于 2022-12-9 13:11 编辑

因为C++是在C语言的基础上引入了很多更先进的语法和功能,因此编译器处理后,因为要转换为与C语言对等的可执行二进制文件,因此可能会塞很多未知的等效代码段进去以达到目的,进而造成不必要的延时。
曾经在Ubuntu上用g++试过一次,加上-S选项看了等效汇编代码后和意想当中的完全是两面,本来一个类似于楼主这样的简单for循环,被g++,只需要一些cmp和jnz等指令就可以实现,硬是被它塞了很多自己的segment,再调用对应的预设代码段来实现。还有很多奇怪的变量名只有编译器自己能懂,我看不懂,像极了IT公司里面看同事代码的样子。

另外楼主也可以尝试开启 -O2 选项,再看看用时是多少。


Ph-苯
src_resources 发表于 2022-12-9 13:10
因为C++是在C语言的基础上引入了很多更先进的语法和功能,因此编译器处理后,因为要转换为与C语言对等的可 ...

开了O2,结果变成0了……改成循环0xffffffffffffffff次,还是0……

w6vDqw
本帖最后由 w6vDqw 于 2022-12-11 11:43 编辑

我的评价是,基于栈操作的语言,和用指针直接操作内存的语言比,这就是找虐。
你觉得C++慢肯定是因为你没做好优化。
粗略看了一眼,这代码C和C++混用,这就没意思了。要用C++就要有C++的样子。

gmc_awa
所以,优化是一点,JE版慢是没有做好算法优化就被BE吊打。BE优化好但是因为渲染龙的遗留问题所以光影直接被集体枪毙()
兼容又是另一个问题了

Ph-苯
w6vDqw 发表于 2022-12-9 13:46
我的评价是,基于数栈操作的语言,和用指针直接操作内存的语言比,这就是找虐。
你觉得C++慢肯定是因为你没 ...

确实,C++开了编译器优化后直接把循环给优化没了,确实快了。

src_resources
Ph-苯 发表于 2022-12-9 13:31
开了O2,结果变成0了……改成循环0xffffffffffffffff次,还是0……

看了一下代码,for循环指定了100000000次,main函数里调用的函数也只进行了简单的加减和移位操作;定义的变量v2i 也只是简单的调用了一下这些运算函数,并未实际使用。
估计是编译器直接把for循环优化了,省去了与v2i变量相关的代码,时间复杂度也直接从O(n)降到了O(1)。

Ph-苯
gmc_awa 发表于 2022-12-9 13:49
所以,优化是一点,JE版慢是没有做好算法优化就被BE吊打。BE优化好但是因为渲染龙的遗留问题所以光影直接被 ...

JE确实很多该有算法的地方都没有,BE就不知道了。

w6vDqw
Ph-苯 发表于 2022-12-9 13:53
确实,C++开了编译器优化后直接把循环给优化没了,确实快了。

那是因为这破玩意被编译器丢到了CPU的L1里面了,所以调用速度超乎你想象。

Ph-苯
src_resources 发表于 2022-12-9 13:55
看了一下代码,for循环指定了100000000次,main函数里调用的函数也只进行了简单的加减和移位操作;定义的 ...

我改了,在最后打印v2i,这样就不会被整个优化掉了。

洞穴夜莺
w6vDqw 发表于 2022-12-9 13:57
那是因为这破玩意被编译器丢到了CPU的L1里面了,所以调用速度超乎你想象。 ...

这段循环确实是被C++编译器直接删掉了,这点可以用-S编译选项编译时看到

洞穴夜莺
w6vDqw 发表于 2022-12-9 13:46
我的评价是,基于数栈操作的语言,和用指针直接操作内存的语言比,这就是找虐。
你觉得C++慢肯定是因为你没 ...

在变量不太多不太大并且没有取地址运算的情况下,Java和C++都是直接在寄存器中运算,并不会操作内存

当然我不知道你在说什么,上面这段代码哪有指针???

第一页 上一页 下一页 最后一页