效率比较:程序块还是单独函数

m
microsat
楼主 (北美华人网)
假设你写一个几何平面的面积函数: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; } }
类似上面这样的循环里面调用子函数的。是用子函数效率高,还是把子函数去掉,用代码快,效率更高?


c
claireliu
效率上没什么大区别,分开成独立函数清楚一些。
m
microsat
效率上没什么大区别,分开成独立函数清楚一些。
claireliu 发表于 2023-04-26 12:16

多谢! 请问你做过这方面的测试吗?
如果子函数多的话,子函数的调用和关闭,是不是很折损效率?
假设运行1亿次。

s
skyflyer88
假设你写一个几何平面的面积函数: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掉
t
ted.hanks
注重效率的话,当然是去掉子函数
当然就算你写了子函数,编译器应该会给你优化inline掉
skyflyer88 发表于 2023-04-26 12:59

compiler 做很多事情的,不需要pre optimization。 除非你做profiling, 能看到效率的差距。
千渔千寻
回复 3楼microsat的帖子
单机速度快,肯定是写在里面啊。函数都是要压栈出栈的。
另外还有loop unrolling
s
skyflyer88
compiler 做很多事情的,不需要pre optimization。 除非你做profiling, 能看到效率的差距。
ted.hanks 发表于 2023-04-26 13:08

在不影响程序可读可维护性的前提下,还是鼓励手工优化。具体原因就不多说了
H
Hesterhql
哈哈 这个不是抽象类 接口最好的应用实例么?
g
gokgs
哈哈 这个不是抽象类 接口最好的应用实例么?
Hesterhql 发表于 2023-04-26 15:46

就是阿,典型的 virtual function 的应用。
学习一下class 的基本概念先。
否则这是 20 年前的程序。
千渔千寻
回复 9楼gokgs的帖子
关键是人家要得是快。
g
gokgs
回复 9楼gokgs的帖子
关键是人家要得是快。
千渔千寻 发表于 2023-04-26 19:50

哈哈, 你确定他知道什么叫快吗? 你也未必知道答案。 好多 junior engineer 根本不知道什么叫快。
纠结 virtual function 效率的 大概只有做 hardware 的那些人。
m
majiaamajia
这个不是经典的工厂模式吗?
c
claireliu
多谢! 请问你做过这方面的测试吗?
如果子函数多的话,子函数的调用和关闭,是不是很折损效率?
假设运行1亿次。


microsat 发表于 2023-04-26 12:22

如果要快,if else这些逻辑判断都应该去掉,搞成no branch的。用openmp之类的并行一下你那个面积计算。inline当然会快一些。也看你需要多快,还挺多technique的。