效率上没什么大区别,分开成独立函数清楚一些。 claireliu 发表于 2023-04-26 12:16
假设你写一个几何平面的面积函数:area(string x,params) x是几何体形状,有三角型,正方形,圆形等等。 是把每种形状的面积计算都弄成一个独立的函数,然后area里面去调用这些函数, 还是不弄成独立的函数,每种形状的面积计算都弄成area里的一个程序块, 这两种方式,哪种的效率高(编译器调用效率,高速运算时的并行效率)? for(int i=0;i<1e5;i++) { if (x==''''''''triangle'''''''') { call triangle_area_function; } else if (x==''''''''square'''''''') { call square_area_function; } else if (x==''''''''rectangle'''''''') { call rectangle_area_function; } } 类似上面这样的循环里面调用子函数的。是用子函数效率高,还是把子函数去掉,用代码快,效率更高? microsat 发表于 2023-04-26 11:58
注重效率的话,当然是去掉子函数 当然就算你写了子函数,编译器应该会给你优化inline掉 skyflyer88 发表于 2023-04-26 12:59
compiler 做很多事情的,不需要pre optimization。 除非你做profiling, 能看到效率的差距。 ted.hanks 发表于 2023-04-26 13:08
哈哈 这个不是抽象类 接口最好的应用实例么?Hesterhql 发表于 2023-04-26 15:46
回复 9楼gokgs的帖子 关键是人家要得是快。 千渔千寻 发表于 2023-04-26 19:50
多谢! 请问你做过这方面的测试吗? 如果子函数多的话,子函数的调用和关闭,是不是很折损效率? 假设运行1亿次。 microsat 发表于 2023-04-26 12:22
是把每种形状的面积计算都弄成一个独立的函数,然后area里面去调用这些函数, 还是不弄成独立的函数,每种形状的面积计算都弄成area里的一个程序块, 这两种方式,哪种的效率高(编译器调用效率,高速运算时的并行效率)?
for(int i=0;i<1e5;i++) { if (x==''''triangle'''') { call triangle_area_function; } else if (x==''''square'''') { call square_area_function; } else if (x==''''rectangle'''') { call rectangle_area_function; } }
类似上面这样的循环里面调用子函数的。是用子函数效率高,还是把子函数去掉,用代码快,效率更高?
多谢! 请问你做过这方面的测试吗?
如果子函数多的话,子函数的调用和关闭,是不是很折损效率?
假设运行1亿次。
注重效率的话,当然是去掉子函数
当然就算你写了子函数,编译器应该会给你优化inline掉
compiler 做很多事情的,不需要pre optimization。 除非你做profiling, 能看到效率的差距。
单机速度快,肯定是写在里面啊。函数都是要压栈出栈的。
另外还有loop unrolling
在不影响程序可读可维护性的前提下,还是鼓励手工优化。具体原因就不多说了
就是阿,典型的 virtual function 的应用。
学习一下class 的基本概念先。
否则这是 20 年前的程序。
关键是人家要得是快。
哈哈, 你确定他知道什么叫快吗? 你也未必知道答案。 好多 junior engineer 根本不知道什么叫快。
纠结 virtual function 效率的 大概只有做 hardware 的那些人。
如果要快,if else这些逻辑判断都应该去掉,搞成no branch的。用openmp之类的并行一下你那个面积计算。inline当然会快一些。也看你需要多快,还挺多technique的。