我想知道修改代码以使用math.h
exp
的查找表是否有任何意义,或者在clang++
给出-O3
时是否由#pragma
自动完成旗。
如果不是,是否有exp(-a*x)
这样做?
澄清
我在谈论函数调用的memoisation。也就是说,如果函数传递了相同的精确参数(是的,浮点数实际上可以是相同的,如果它们是从常量和整数派生的)。
示例
假设我要运行a
,其中x
不是编译时常量,但一旦设置一次,它就不会被修改。类似地,class Pet :
def main() :
print(getName())
print(getSpecies())
print(getAge())
def getName(self) :
name = str(input("What is your pets name: "))
return name
def getSpecies(self) :
species = str(input("What is your pets species: "))
return species
def getAge(self) :
age = int(input("Please type in your age: "))
return print(age)
main()
可以是10个可能值中的一个,所有值都设置一次,而不是再次修改。
答案 0 :(得分:2)
我对clang细节知之甚少,所以我无法详细说明它的作用。但我可以推断它可以做什么。
如果参数是编译时常量,那么优化器可能能够在编译/链接时预先计算。但这绝不是必须的,我不希望所有的编译器都这样做。
如果参数不是编译时常量,并且同一函数内的多个调用使用相同的参数(并且没有涉及易失性对象),那么优化器可能会重新使用结果,如果它知道函数不有副作用。这个优化我建议你手动完成,因为最好不要重复自己。
如果参数不是编译时常量,那么你可以将结果存储在某个地方稍后要使用的表中,但是加载该值的内存访问可能比进行计算本身慢得多,所以这可能会结束是一种悲观情绪。
显然,进行任何这些优化是否有任何意义,取决于许多方面,例如CPU架构,缓存等,最重要的是首先考虑操作是否对性能有任何重大影响。 / p>