我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?
我正在谷歌搜索过去一小时的问题,但只有泰勒系列或一些示例代码的要点太慢或根本不编译.好吧,我发现谷歌的答案大多是"Google it,它已经被问到了",但遗憾的是它不是 ......
我在低端Pentium 4上分析我的游戏,发现大约85%的执行时间浪费在计算窦,cosinus和平方根(来自Visual Studio中的标准C++库)上,这似乎与CPU密切相关(在我的I7上,相同的功能只有5%的执行时间,并且游戏更快了waaaaaaaaaa).我不能优化这三个函数,也不能在一次传递中计算正弦和余弦(相互依赖),但我不需要太精确的模拟结果,所以我可以使用更快的逼近.
那么,问题是:在C++中计算float的正弦,余弦和平方根的最快方法是什么?
编辑 查找表更加痛苦,因为在现代CPU上产生的Cache Miss比Taylor系列更昂贵.这些天CPU很快,而缓存则不然.
我犯了一个错误,我虽然需要为Taylor系列计算几个阶乘,我现在看到它们可以实现为常量.
所以更新的问题是:对于平方根还有任何快速优化吗?
EDIT2
我使用平方根计算距离,而不是规范化 - 不能使用快速反平方根算法(如评论中所指出:http://en.wikipedia.org/wiki/Fast_inverse_square_root
EDIT3
我也无法在平方距离上操作,我需要精确的距离进行计算
根据C FAQ,基本上有3种用于在C中"内联"代码的实用方法:
#define MACRO(arg1, arg2) do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
Run Code Online (Sandbox Code Playgroud)
要么
#define FUNC(arg1, arg2) (expr1, expr2, expr3)
Run Code Online (Sandbox Code Playgroud)
为了澄清这一点,参数在表达式中使用,逗号运算符返回最后一个表达式的值.
要么
使用inline支持作为gcc扩展和c99标准的声明.
该do { ... } while (0)方法在Linux内核中被广泛使用,但是我还没有经常遇到其他两种方法.
我指的是多语句"函数",而不是像MAX或MIN这样的单语句.
每种方法的优点和缺点是什么,为什么在各种情况下你会选择一种方法呢?
根据我的理解,宏和函数之间的区别在于宏调用将被定义中的指令替换,而函数执行整个push,branch和pop -thing.这是对的,还是我理解错了?
另外,如果这是正确的,那就意味着,宏会占用更多空间,但会更快(因为缺少推送,分支和弹出指令),不是吗?
我经常在我的代码中有这样的陈述:
(b != 0) ? a / b : a
Run Code Online (Sandbox Code Playgroud)
在速度和最佳C++实践方面,做功能更好
float divifnotzero(a,b) { ... return ... }
Run Code Online (Sandbox Code Playgroud)
或像这样的预处理器宏?
#define divifnotzero(a,b) ((b!=0)?a/b:a)
Run Code Online (Sandbox Code Playgroud) c++ ×4
c ×3
macros ×3
inline ×2
division ×1
math ×1
optimization ×1
profiling ×1
trigonometry ×1
unix ×1