|
|
1
11
|
|
|
2
7
从定义上讲,你是在歪曲结果。 以下是如何解决试图分析您为测试而编写的“虚拟”代码的问题: 对于分析,将结果保存到全局/静态数组中,并在程序结束时将数组的一个成员打印到输出中。编译器将无法进行优化 出 在数组中放置值的任何计算,但您仍然会得到它可以进行的任何其他优化,以使代码更快。 |
|
|
3
6
然后,您的调用代码可以使用printf来执行它,以确保它不会对其进行优化。还要确保float_to_int在一个单独的编译单元中,这样编译器就不会耍任何花招。
现在将其与一个空函数进行比较,例如:
时间上的差异应该能让你了解你试图衡量的费用。 |
|
|
4
5
到目前为止,我使用的所有编译器都能正常工作:
请注意,这会扭曲结果,boith方法应该写入
尽管如此,读取和写入之间的所有优化都可以“全力”应用。在检查生成的程序集时,对全局变量的读写操作通常是很好的“防线”。
没有
|
|
|
5
4
正如其他人所建议的那样,您需要检查资产管理器输出,以检查这种方法是否真的有效。 |
|
|
6
3
你只需要跳到你学到一些东西并阅读已发表文章的部分 Intel CPU optimisation manual . 这些非常清楚地表明,在float和int之间进行强制转换是一个非常糟糕的主意,因为它需要从int寄存器到内存进行存储,然后加载到float寄存器中。这些操作会在管道中产生气泡,浪费许多宝贵的循环。 |
|
|
7
2
函数调用会产生相当大的开销,所以无论如何我都会删除它。 添加一个虚拟值+=i;没问题,只要你在备用配置文件中也保留这段相同的代码。(因此,您将其与之进行比较的代码)。 最后但同样重要的是:生成asm代码。即使你不能用asm编码,生成的代码通常也是可以理解的,因为它后面会有标签和注释的C代码。所以你知道(排序)会发生什么,以及保留了哪些位。 R p.s.也发现了这一点:
据说也很快。你可能也想分析一下。(尽管它几乎不是可移植代码) |
|
|
8
1
返回值?
然后在调用站点,您可以将所有返回值相加,并在基准测试完成后打印出结果。通常的做法是确保你依赖结果。 您可以使用全局变量,但这似乎会产生更多的缓存未命中。通常,只需将值返回给调用者(并确保调用者确实对其做了一些事情)就可以了。 |
|
|
9
1
如果你使用的是微软的编译器-
关闭当前行之后定义的函数的优化:
重新启用优化:
例如,在下图中,您可以注意到3件事。
类似的指令也适用于
|
|
|
10
0
围绕这一声明的微观基准并不能代表在真实场景中使用这种方法;周围的指令及其对管道和缓存的影响通常与任何给定的语句本身一样重要。 |
|
|
11
0
GCC 4现在做了很多GCC 3.4从未做过的微优化。GCC4包括一个树矢量器,它可以
非常
很好地利用了SSE和MMX。它还使用GMP和MPFR库来帮助优化对以下内容的调用
我知道英特尔编译器也非常擅长这类优化。 我的建议是不要担心这样的微观优化——在相对较新的硬件(过去5年或6年内构建的任何硬件)上,它们几乎完全没有意义。
编辑:在最近的CPU上,FPU
有关所有详细信息,请查看AMD和Intel处理器编程手册。 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
|
Daniel Lobo · 使用约束进行优化 1 年前 |
|
Sergio · python中大量数字的乘法 2 年前 |
|
|
Sergey Dev · 临时表与表变量 2 年前 |
|
|
John · 减少C中的内存消耗++ 2 年前 |