即使在最大优化下,如何强制部分未完成的代码运行?

时间:2011-03-15 06:22:38

标签: c++ visual-studio-2008 visual-c++ compiler-optimization

我的程序中有一个函数可以预先形成一大堆浮点数学。它返回一个值数组,这些值当前尚未在我的程序中使用。

我想在最大优化下测试这段代码以获得速度,但是由于代码没有被使用,编译器会方便地一起跳过这个函数,我无法在它上面得到时间。

如果不使用结果,如何强制编译器在最大优化下运行该部分代码(我希望计算机只是让我了解该部分的运行速度)。

我正在运行Visual C ++ 2008。

4 个答案:

答案 0 :(得分:3)

您可以使用SecureZeroMemory()覆盖从函数接收到的结果。你甚至不需要覆盖整个结果,一个数组元素就足够了,也许你甚至可以将零作为“字节数”传递,这样函数就不会做任何事情。

这将在Windows上实现 - SecureZeroMemory()旨在永远不会被编译器优化。使用它非常简单,而且速度相当快。

答案 1 :(得分:2)

这就是测试案例的用途。在单独的二进制文件中写一个测试用例(甚至只是在main()方法中),它将一次性局部变量设置为函数的结果。使用您首选方法的时间(例如,通过在分配之前和之后捕获时间(NULL)并打印时差)。你应该有一个体面的运行时间。

编辑:时间(NULL)是全秒精度=坏和邪恶。使用clock(),如here所示,以获得C / C ++标准库中最精确的精度。

答案 2 :(得分:2)

我确信有很多编译器技巧,但最简单的方法就是让它看起来像是在使用该值。在这种情况下,只需将返回的数组传递给其他函数。另一个函数不需要做任何事情,但这应该足以说服编译器你需要结果。

如果你发现你的空第二个函数也被优化了,那么只需将它粘贴在一个共享库(DLL)中,编译器就不可能知道它是如何被使用的。

如何分配结果也可以改变这一点。如果您将原始函数传递给指针,则可以将其传递给堆指针。由于该指针可能在其他地方使用,因此编译器极不可能优化代码,因为它不知道结果是否会被使用。


您也可以合法地使用这些数据。在另一个函数中验证结果是有意义的。如果进行性能测试,只需将此验证部分放在定时部分之外。这通常是我进行此类性能测试的方法(确保检查/使用结果)。

答案 3 :(得分:0)

如果你使用visual studio,这里的代码可以正常工作,但是还不知道gcc的任何其他解决方案

#pragma optimize( "", off )
.
.
.
#pragma optimize( "", on )