在我最近的一些程序中,我一直在使用基本的微积分来替换if
语句,例如我使用的for
循环:
pos = cbltSz*(x-1)
获取小立方体相对于大立方体的位置,而不是像if(x == 0){pos = -cbltSz}
那样说出来。这或多或少是为了稍微消除代码。但它让我思考。使用数学在多大程度上超出预先定义的语句/函数?它会因语言而异的程度有多大?这是假设我的数学使用 优于其他选择,而不是美学。
答案 0 :(得分:0)
请注意,如果pos = cbltSz*(x-1)
非零,则您的语句if(x == 0){pos = -cbltSz}
和x
不等效:第一个将pos
设置为某个确定值,而第二个将#info {
position: absolute;
left: 0px;
top: 0px;
color: #000;
设置为它以前的价值。这种差异的重要性取决于你的其他程序。这两个陈述在清晰度上也有所不同 - 第二个陈述更好地表达了你的目的,而第一个陈述不"稍微消除了代码"。在大多数程序中,提高清晰度比速度略有提高更为重要。
因此,您的问题的答案取决于太多因素,无法在此处获得完整答案。
答案 1 :(得分:0)
现代CPU拥有深层管道,因此分支机构的错误预测可能会对性能产生相当大的影响。另一方面,它们往往具有相当大的浮点计算能力,通常能够在不同的ALU上并行执行多个浮点运算。因此,这种方法可能会带来性能优势。但这一切都取决于。如果应用程序已经进行了大量的数字运算,那么ALU可能已经饱和。如果分支预测器做得很好,那么在许多应用中,分支误预测可能很少见。
因此,我采用通常的优化规则:不要尝试手动优化所有内容。不要以可读性和可维护性为代价进行优化。如果您遇到性能瓶颈,请确定代码库的热门部分并考虑其替代方案。尝试基准测试中的替代方案,因为理论上的考虑只能让你到目前为止。
答案 2 :(得分:0)
大多数早期的编程语言设计者不理解,许多人仍然不理解,数学函数与用户定义的函数有点不同。如果我们完成任何触发,我们都知道罪(PI / 8)意味着什么,我们很高兴将类嵌入到像
这样的表达式中 rx = cos(theta) * x - sin(theta) * y;
但是你自己编写的函数很少像基本的数学函数。它们采用了几个参数,它们返回了几个参数,通常不太明确它们的作用。你想要的最后一件事就是将它们嵌入到复杂的表达中。
其次,数学有其自己的符号系统是有原因的。只要表达式高于某种低复杂度,编程语言的缩减,仅ascii系统就会崩溃。 (我使用三个规则,三个级别的嵌套括号都是你的用户可以接受的)。而且,如果没有特殊的编程支持,编程功能就无法逃脱它们的领域。
pow(sqrt(-1), sqrt(-1));
除非您安装了复杂的数学库,否则将无法执行您想要的操作。
至于性能,一些Fortran和C编译器非常积极地优化数学例程,具有恒定的传播等。其他人不会。这取决于。