繁体   English   中英

我如何强制一段未完成的代码在最大优化下运行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM