相关疑难解决方法(0)

如何分析在Linux上运行的C++代码?

我有一个在Linux上运行的C++应用程序,我正在优化它.如何确定代码的哪些区域运行缓慢?

c++ unix profiling

1732
推荐指数
12
解决办法
49万
查看次数

内联函数与预处理器宏

内联函数与预处理器宏有何不同?

c c++ macros inline

107
推荐指数
6
解决办法
8万
查看次数

在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++ math optimization trigonometry

34
推荐指数
10
解决办法
6万
查看次数

C语言中不同宏功能/内联方法的优缺点

根据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这样的单语句.

每种方法的优点和缺点是什么,为什么在各种情况下你会选择一种方法呢?

c macros inline

9
推荐指数
2
解决办法
6856
查看次数

C中的宏与函数之间的区别与指令存储器和速度有关

根据我的理解,宏和函数之间的区别在于宏调用将被定义中的指令替换,而函数执行整个push,branch和pop -thing.这是对的,还是我理解错了?

另外,如果这是正确的,那就意味着,宏会占用更多空间,但会更快(因为缺少推送,分支和弹出指令),不是吗?

c macros c-preprocessor

3
推荐指数
2
解决办法
1040
查看次数

如果不同于0除以

我经常在我的代码中有这样的陈述:

(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++ division c-preprocessor

0
推荐指数
1
解决办法
114
查看次数