[英]How do I force a section of unfinished code to run even under max optimizations?
我的程序中有一个函数可以执行一大堆浮点数学运算。 它返回一个值数组,该值数组目前尚未在我的程序中使用。
我想在最大优化下测试这段代码的速度,但是由于未使用该代码,因此编译器可以方便地一起跳过该函数,因此我无法花时间。
即使未使用结果,如何强制编译器在最大优化下运行该部分代码(我希望计算机让我感觉到该部分运行的速度如何)。
我正在运行Visual C ++ 2008。
从函数接收到结果后,可以使用SecureZeroMemory()
覆盖结果。 您甚至不需要覆盖整个结果,一个数组元素就足够了,也许您甚至可以将零作为“字节数”传递,这样函数就不会做任何事情。
这将在Windows上解决问题- SecureZeroMemory()
不会由编译器优化SecureZeroMemory()
。 使用它非常简单,而且非常快捷。
这就是一个测试用例。 用一个单独的二进制代码编写一个测试用例(甚至只是在main()方法中),它将一个一次性的局部变量设置为函数的结果。 使用您喜欢的方法进行时间设置(例如,通过捕获分配前后的time(NULL)并打印时差)。 您应该对运行时间有一个体面的想法。
编辑 :time(NULL)是整秒精度=坏。 使用时钟()中,如图这里 ,在C / C ++标准库中的最准确的精度。
我敢肯定有很多编译器技巧,但是最简单的方法就是使其看起来像您在使用该值。 在这种情况下,只需将返回的数组传递给其他函数。 另一个函数不需要执行任何操作,但这足以说服编译器您需要结果。
如果您发现空的第二个函数也正在被优化,则只需将其粘贴在共享库(DLL)中,编译器就不可能知道它的用法。
您如何分配结果也可以改变这一点。 如果您向原始函数传递一个指针,则可以向其传递一个堆指针。 由于该指针可能在其他地方使用,因此编译器极不可能优化代码,因为它不知道是否使用结果。
您也可以合法使用数据。 在另一个函数中验证结果是有意义的。 如果进行性能测试,只需将此验证部分放在定时部分之外。 通常,这就是我进行此类性能测试的方式(确保检查/使用了结果)。
如果您使用的是Visual Studio,则下面的代码可以使用,但idon不知道gcc的其他解决方案
#pragma optimize( "", off )
.
.
.
#pragma optimize( "", on )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.