快速检验NRV优化测试代码
在读《深度探索C++对象模型》一书时,看到NRV(named return value)优化的说明,
觉得很有意思,于是写了一段小的代码,来测试下有NRV优化和无NRV优化有什么区别。
测试环境:Win7
编译软件: VS2008
说明:VS2008上Debug和Release版本已经天然区别开了NRV优化情况。
Debug版本无NRV优化,Release版本有NRV优化,因此,可以直接通过编译不同版本来进行测试。
(其实说白了,在NRV优化是由选项控制的,在Optimization中O1/O2都可以打开NRV优化,Od关闭NRV优化)
代码如下:
// teset.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
#include "atltime.h"
using namespace std;class test
{friend test foo(double);
public:test(){memset(array, 0, 10000*sizeof(double));}
private:double array[10000];
};test foo(double val)
{test local;local.array[0] = val;local.array[99] = val;return local;
}int _tmain(int argc, _TCHAR* argv[])
{ CTime t = CTime::GetCurrentTime(); cout << t.GetHour() << ":" << t.GetMinute() << ":" << t.GetSecond() << endl; //start timefor (int i = 0; i < 10000000; i++){test t = foo(double(i));}t = CTime::GetCurrentTime(); cout << t.GetHour() << ":" << t.GetMinute() << ":" << t.GetSecond() << endl; //end timereturn 0;
}
Debug版本执行结果为:
16:46:45
16:48:28
请按任意键继续. . .
Release版本执行结果为:
16:48:55
16:48:55
请按任意键继续. . .
可以看到Debug版本需要102秒,而Release版本在1秒内就完成了,可以NRV优化后确实效果不错。
看到这里你可以还有疑问,Release版本不光优化了NRV,还有其他优化的。
没有关系,我们再做个试验,将O2开关关闭,再运行下Release版本,这里测试出的时间与Release打开O2开关的时间之差就大概是NRV优化后的执行时间。
测试结果如下:
Release版本去掉NRV优化执行时间:
16:53:24
16:54:33
请按任意键继续. . .
这里花了68秒。
68-1 = 67 秒,
就是说NRV优化大概节省了67秒的时间。
确实效果非常明显。
快速检验NRV优化测试代码相关推荐
- 提高C++性能的编程技术笔记:编码优化+测试代码
缓存:在现代处理器中,缓存经常与处理器中的数据缓存和指令缓存联系在一起.缓存主要用来存储使用频繁而且代价高昂的计算结果,这样就可以避免对这些结果的重复计算.如,循环内对常量表达式求值是一种常见的低性能 ...
- 提高C++性能的编程技术笔记:虚函数、返回值优化+测试代码
虚函数:在以下几个方面,虚函数可能会造成性能损失:构造函数必须初始化vptr(虚函数表):虚函数是通过指针间接调用的,所以必须先得到指向虚函数表的指针,然后再获得正确的函数偏移量:内联是在编译时决定的 ...
- 提高C++性能的编程技术笔记:设计优化/可扩展性/系统体系结构相关+测试代码
1. 设计优化 我们可以粗略地将性能优化分为两种类型:编码优化和设计优化.编码优化定义为不需要完整理解要解决的问题或者应用程序的执行流程就能实施的优化.通过定义看出,编码优化用于局部代码,同时该过程不 ...
- GCC编译器下NRV优化
阅读侯捷老师翻译的深度探索C++对象模型时所进行的相关测试以及自己的理解 文章目录 一.浅讲NRV优化 二.测试代码 三.运行结果 四.结果分析以及解释 五.相关思考 六.没有NRV优化时的情况 总结 ...
- 自己动手理解NRV优化
一.NRV的简单理解 NRV是Named Return Value的简称.NRV优化简单的说:有一条语句,A a = f():其中f()是一个函数,函数里边申请了一个A的对象b,然后把对象b返回.在对 ...
- C++对象模型的那些事儿之五:NRV优化和初始化列表
前言 在C++对象模型的那些事儿之四:拷贝构造函数中提到如果将一个对象作为函数参数或者返回值的时候,会调用拷贝构造函数,编译器是如何处理这些步骤,又会对其做哪些优化呢?本篇博客就为他家介绍一个编译器的 ...
- FFmpeg中libswresample库简介及测试代码
libswresample库功能主要包括高度优化的音频重采样.rematrixing和样本格式转换操作. 以下是测试代码(test_ffmpeg_libswresample.cpp),对音频了解较少, ...
- FFmpeg中libswscale库简介及测试代码
libswscale库功能主要包括高度优化的图像缩放.颜色空间和像素格式转换操作. 以下是测试代码(test_ffmpeg_libswscale.cpp): #include "funset ...
- 提高C++性能的编程技术笔记:内联+测试代码
内联类似于宏,在调用方法内部展开被调用方法,以此来代替方法的调用.一般来说表达内联意图的方式有两种:一种是在定义方法时添加内联保留字的前缀:另一种是在类的头部声明中定义方法. 虽然内联方法的调用方式和 ...
最新文章
- BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)
- 开发漫谈:RedMonk编程语言流行榜出炉
- 【集训第四天·继续刷题】之 lgh怒刚ypj
- AMDD 一个把大问题分成小问题的优化算法
- QT的QScroller类的使用
- 史上最全Vim快捷键键位图(入门到进阶)
- MFC 双击控件 提示重载函数已存在
- 前端学习(3205):对state的理解
- 安卓dts音频解码_家庭影院三维音效技术应用之DTS:X摆位
- HDU 2685 I won't tell you this is about number theory
- 酒吧、ktv、夜店收银系统分析
- 深入理解Android网络编程 技术详解与最佳实践电子书pdf下载
- 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
- 计算机蓝屏代码0x000000ED,XP系统蓝屏提示错误代码0x000000ED怎么办?
- 常见的研究方法有哪些?
- python列表的增删查改,已经冒泡,选择,快速排序
- 去广告:去除2345好压、Flash插件等的广告
- 使用ajax报405错误
- UltraEdit各种wordfile下载
- 网站服务器评测,9.2分! 浪潮服务器受到海外权威专业评测网站肯定
热门文章
- 本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
- HTML5期末大作业:榆林子州网站设计——榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业
- 【LaTeX技巧】 | LaTeX数学公式环境中添加删除线
- MySQL常用Json函数
- 电子授权 vs. 加密锁
- 大数据在工业领域的架构与应用
- 【转载】基于android的远程视频监控系统(已开放源码)_只有链接
- Python数据可视化第六节(坐标轴的定制)
- Android中保存图片到本地功能实现
- Vue3 + Element-Plus upload组件封装限制上传数量,再次上传则覆盖