当使用成员超过函数变量时,在优化/速度方面有任何差异吗?
Is there any difference in optimization/speed when using member over function variable?
假设有一个用于从某个位置读取数据的类,并以不同的格式(不是线程安全的)提供它。对于它读取的每一项,它做如下操作:
TargetDataStruct HostToTargetConverter::Next()
{
HostDataStruct source;
sourceData->GetItem(m_index++, &source);
TargetDataStruct target;
target.seize = source.day;
target.have = source.fun;
return target;
}
在编译器的速度或可优化性方面,将HostDataStruct source
和TargetDataStruct target
声明为成员变量会有什么不同吗?我的想法是,这两个结构不需要每次调用都推到堆栈上,也不需要每次都初始化。
一般来说,没有比"视情况而定"更好的答案了。
使HostDataStruct
和TargetDataStruct
成为成员所产生的差异包括;
- 对它们的每次访问都会取消一个指针的引用。在成员内部包含类访问
source
和target
的函数分别求this->source
和this->target
(即this
). - 如果包含对象只构造一次(例如未创建)并被反复摧毁)那么它的成员也是如此。那意味着构造的开销只发生一次(对于包含对象的每个实例),而不是每次调用函数都构造它们。 在你的代码中,对象将在你的函数中被重新分配(即它的值被改变)。这是每次调用函数时的开销(并且抵消了对象构造函数只调用一次的事实)。
问题是,这些东西的成本确实各不相同。小型对象的构建和销毁成本较低,而大型对象的构建和销毁成本较高。复杂的构造函数(或析构函数)最好只构造一次对象(即使对象很小,构造函数也可能访问其他资源)。访问局部构造对象的成员是编译器可以高效实现的,而指针的解引用涉及更多的操作,因此编译器可能不会特别高效地实现。
要找出哪个选项提供更好的运行时速度,您需要进行测试——例如使用分析器。您得到的结果很可能是特定于您的编译器、主机配置等。
在你的代码中HostDataStruct &TargetDataStruct在堆栈中,所以读/写的访问是最快的。
优化删除所有不必要的操作
现在,如果你把source和target作为成员,唯一可以使你的代码更快的是,如果你的对象构造函数多次使用(通常是在构造函数中调用"new"),并且你的代码经常调用。
为了可读性,您可以创建这样的转换构造函数:
TargetDataStruct(const HostDataStruct& value);
所以你的代码将是
TargetDataStruct HostToTargetConverter::Next()
{
HostDataStruct source;
sourceData->GetItem(m_index++, &source);
return TargetDataStruct(source);
}
但是你也可以避免HostDataStruct分配如果你的sourceData容器/对象保持数据存活,使你的sourceData->GetItem()返回一个常量HostDataStruct&;
const HostDataStruct& GetItem(const int p_id);
,你的代码将是这样的:
TargetDataStruct HostToTargetConverter::Next()
{
return TargetDataStruct(sourceData->GetItem(m_index++, &source));
}
最后一个解决方案应该是最快的,避免无用的复制和对象构造。
如果你仍然需要性能,即:如果你的代码经常被调用,做以下事情:在第一次调用时,在缓存中构建TargetDataStruct,然后始终返回对缓存数据的引用。
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 文件系统:复制功能的速度秘诀是什么
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 查找标准::hash_map与标准::矢量的速度
- 加快在C++中读取/处理日志文件的速度
- 为什么这些算法的运行速度比它们应该的要快?
- 如何提高文件的读取速度?
- 为什么我的代码在指针方面停止运行?
- 通过libpqxx提高PostgreSQL数据库的更新速度
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 按值在地图中查找 - 方法在速度方面的偏好
- 性能方面,按位运算符与正常模数的速度有多快
- GObject vs C++:GObj 提供什么好处,它在速度/大小方面如何比较
- SDL_HWSURFACE和SDL_SWSURFACE在速度和性能方面有什么区别吗?
- 当使用成员超过函数变量时,在优化/速度方面有任何差异吗?
- 在速度/效率方面,Allegro vs OpenGL