请问,当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循环里。这个while循环在if里面。 但是,这样的动态函数构造,能节省计算时间吗? if (shape == XXX) { int i = 0; while(i<1e8){ ...1千行代码 XXX_area(); ... i = i+1; } //end while } //end if
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。 不过我还是那句话,profiling before doing any optimization.
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。 不过我还是那句话,profiling before doing any optimization. faint_u 发表于 2023-12-01 00:47
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。 不过我还是那句话,profiling before doing any optimization. faint_u 发表于 2023-12-01 00:47
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
你这速度上应该比if 在 while内部要快,因为if只执行一次。
多谢!我就是想构造这样一个动态函数在while循环里。这个while循环在if里面。 但是,这样的动态函数构造,能节省计算时间吗?
if (shape == XXX) { int i = 0; while(i<1e8){ ...1千行代码 XXX_area(); ... i = i+1; } //end while } //end if
我这样写,是为了避免函数的调用。一个while循环里,函数越多,越浪费时间。特别是对于一行一行运行的语言。
是比if在while内部快很多。因为if需要执行1e8次,如果在while内部。
如何把这样的if移到while的外面去呢。if里面控制的是一个动态函数。
现代计算机体系和编译系统对函数调用早都优化的不能再优化了。函数调用产生的性能微乎其微。你这代码看起来是c语言,除非你是在用一个很烂的解释器执行c语言,或者是超高速度实时系统,否则根本不需要考虑这个层面的优化。
如果程序执行真的很慢,建议先做profiling找到bottle neck再说。amature optimization 大部分只会制造新问题。
大部分情况下代码可读性和可维护性要比效率更重要,如果两个程序员interview,一个写成这样,另外一个把代码重构成更简洁的多个函数,我绝对会选择第二个而不是第一个。
worst case就算是函数调用导致的开销,内联加强制内联一样可以在不影响可读性的情况下减少函数调用的开销。
纯c的话你可以用函数指针。把循环体整个包装成一个函数,参数是一个函数指针,调用的时候根据if传递triangle或者rectangle的函数指针。稍微有点儿面向对象支持的语言就可以用虚函数加多态来解决。
不过我还是那句话,profiling before doing any optimization.
可读性和可维护性是重要。 但是我这个循环是10亿张人脸图像。 while里面 如果每多一个函数 就导致程序要多运行一天。
如果每多一个if条件 程序要多运行8小时。
等不了这么久。
时间更重要。
多谢!
想了想多态。
多态其实就是 在while里面放一个函数 while() { area() }
然后这个函数里面有个if语句,来判断多种形态。
area(shape) { if(shape=="triangle") { } else if(shape=="rectangle") { } else if (shape =="square"){ } }
所以理论上用虚拟类和多态不能提速。这也是为啥C#的程序好读,好维护,但是速度比c++慢。 而c++的程序比c慢。
你说的多一个函数就要多运行一天,那绝对是你的代码有问题:重构不是新添一个函数,而是把已有代码挪到函数里面,你的overhead最多就是8亿次call instruction,至于函数里的代码原来就有,只是换了个地方。8亿条instruction对现代处理来说根本就是毛毛雨。
至于多态你的理解是完全错误的。你还需要去读读书好好理解一下。多态的本质是虚表加函数指针而不是一堆if else调用不同的函数。