if while还是while if?

g
gooog
楼主 (北美华人网)
请问,当while很大的循环次数,同时,while里面的代码超过1000行的时候。
if条件来决定什么函数选择运行。
是把while放在 if里面,还是把if 放在while里面? 要求:最节省计算时间;同时,代码好读。
是不是下面这段代码是最节省时间?
if (shape == "triangle") { int i = 0; while(i<1e8){ ...1千行代码 triangle_area(); ... i = i+1; } //end while } //end if
if (shape == "rectangle") { int i = 0; while(i<1e8){ ...1千行代码 rectangle_area(); ... i = i+1; } //end while } //end if
if (shape == "square") { int i = 0; while(i<1e8){ ...1千行代码 square_area(); ... i = i+1; } //end while } //end if
人在它乡
while loop 有1000 行code似乎不妥,应该看看是否可以分成小段函数/functions,namely refactoring。
你这速度上应该比if 在 while内部要快,因为if只执行一次。
e
elva_exa
你这个case, if 应该写在while 外面,是O(1), while 里就是O(n) 如果while 里的内容基本一样,应该尽量不要重复写几遍. 这里 可以根据不同的shape,定义一个 method variable, 只需要写一遍while loop, 下面随便找了个例子。 https://stackoverflow.com/questions/4138527/how-to-call-a-java-method-using-a-variable-name 每个method 尽量短,可以reuse, 可以看下clear code 这本书.


f
faint_u
谁敢在一个loop里写1000行代码,除非是机器生成的,人写的我绝对不让他过review。
g
gooog
你这个case, if 应该写在while 外面,是O(1), while 里就是O(n) 如果while 里的内容基本一样,应该尽量不要重复写几遍. 这里 可以根据不同的shape,定义一个 method variable, 只需要写一遍while loop, 下面随便找了个例子。 https://stackoverflow.com/questions/4138527/how-to-call-a-java-method-using-a-variable-name 每个method 尽量短,可以reuse, 可以看下clear code 这本书.



elva_exa 发表于 2023-12-01 00:05

多谢!我就是想构造这样一个动态函数在while循环里。这个while循环在if里面。 但是,这样的动态函数构造,能节省计算时间吗?
if (shape == XXX) { int i = 0; while(i<1e8){ ...1千行代码 XXX_area(); ... i = i+1; } //end while } //end if
g
gooog
谁敢在一个loop里写1000行代码,除非是机器生成的,人写的我绝对不让他过review。
faint_u 发表于 2023-12-01 00:07

我这样写,是为了避免函数的调用。一个while循环里,函数越多,越浪费时间。特别是对于一行一行运行的语言。
g
gooog
while loop 有1000 行code似乎不妥,应该看看是否可以分成小段函数/functions,namely refactoring。
你这速度上应该比if 在 while内部要快,因为if只执行一次。
人在它乡 发表于 2023-11-30 23:42

是比if在while内部快很多。因为if需要执行1e8次,如果在while内部。
如何把这样的if移到while的外面去呢。if里面控制的是一个动态函数。
痘痘猪
1000行的loop…. 可真是个人才
f
faint_u
我这样写,是为了避免函数的调用。一个while循环里,函数越多,越浪费时间。特别是对于一行一行运行的语言。
gooog 发表于 2023-12-01 00:23

现代计算机体系和编译系统对函数调用早都优化的不能再优化了。函数调用产生的性能微乎其微。你这代码看起来是c语言,除非你是在用一个很烂的解释器执行c语言,或者是超高速度实时系统,否则根本不需要考虑这个层面的优化。
如果程序执行真的很慢,建议先做profiling找到bottle neck再说。amature optimization 大部分只会制造新问题。
大部分情况下代码可读性和可维护性要比效率更重要,如果两个程序员interview,一个写成这样,另外一个把代码重构成更简洁的多个函数,我绝对会选择第二个而不是第一个。
worst case就算是函数调用导致的开销,内联加强制内联一样可以在不影响可读性的情况下减少函数调用的开销。
f
faint_u
是比if在while内部快很多。因为if需要执行1e8次,如果在while内部。
如何把这样的if移到while的外面去呢。if里面控制的是一个动态函数。

gooog 发表于 2023-12-01 00:25

纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。
不过我还是那句话,profiling before doing any optimization.
m
meidong20
你这个先琢磨一下object oriented,用个啥pattern直接做成不同的object,每个object自己运行while loop。 1000行代码太长了。refactor。10-20行一个函数。看看有没有更好的算法可以简化。不是说不可能,1000行的代码review绝对不能过
g
gooog
现代计算机体系和编译系统对函数调用早都优化的不能再优化了。函数调用产生的性能微乎其微。你这代码看起来是c语言,除非你是在用一个很烂的解释器执行c语言,或者是超高速度实时系统,否则根本不需要考虑这个层面的优化。
如果程序执行真的很慢,建议先做profiling找到bottle neck再说。amature optimization 大部分只会制造新问题。
大部分情况下代码可读性和可维护性要比效率更重要,如果两个程序员interview,一个写成这样,另外一个把代码重构成更简洁的多个函数,我绝对会选择第二个而不是第一个。
worst case就算是函数调用导致的开销,内联加强制内联一样可以在不影响可读性的情况下减少函数调用的开销。
faint_u 发表于 2023-12-01 00:42

可读性和可维护性是重要。 但是我这个循环是10亿张人脸图像。 while里面 如果每多一个函数 就导致程序要多运行一天。
如果每多一个if条件 程序要多运行8小时。
等不了这么久。
时间更重要。
g
gooog
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。
不过我还是那句话,profiling before doing any optimization.
faint_u 发表于 2023-12-01 00:47

多谢!
g
gooog
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。
不过我还是那句话,profiling before doing any optimization.
faint_u 发表于 2023-12-01 00:47

想了想多态。
多态其实就是 在while里面放一个函数 while() { area() }
然后这个函数里面有个if语句,来判断多种形态。
area(shape) { if(shape=="triangle") { } else if(shape=="rectangle") { } else if (shape =="square"){ } }
所以理论上用虚拟类和多态不能提速。这也是为啥C#的程序好读,好维护,但是速度比c++慢。 而c++的程序比c慢。
f
faint_u
想了想多态。
多态其实就是 在while里面放一个函数 while() { area() }
然后这个函数里面有个if语句,来判断多种形态。
area(shape) { if(shape=="triangle") { } else if(shape=="rectangle") { } else if (shape =="square"){ } }
所以理论上用虚拟类和多态不能提速。这也是为啥C#的程序好读,好维护,但是速度比c++慢。 而c++的程序比c慢。
gooog 发表于 2023-12-01 01:23

你说的多一个函数就要多运行一天,那绝对是你的代码有问题:重构不是新添一个函数,而是把已有代码挪到函数里面,你的overhead最多就是8亿次call instruction,至于函数里的代码原来就有,只是换了个地方。8亿条instruction对现代处理来说根本就是毛毛雨。
至于多态你的理解是完全错误的。你还需要去读读书好好理解一下。多态的本质是虚表加函数指针而不是一堆if else调用不同的函数。