类方法VS类静态函数VS简单函数-性能方面
Class methods VS Class static functions VS Simple functions - Performance-wise?
好的,这是我想要的:
- 我写了几个要求很高的函数(主要是在位图等上操作),这些函数必须尽可能快
- 现在,让我们还提到,这些函数也可以按类型分组,甚至可以按它们操作的变量类型分组
- 问题是,除了算法的实现之外,我还应该做什么——从技术角度来看——以免弄乱速度
现在,我正在考虑以下场景:
- 将它们创建为简单的函数,并将必要的参数作为参数传递
- 创建一个类(用于"分组"/组织目的)并将其声明为静态
- 按类型创建类,例如创建一个用于处理位图的类,为每个位图创建该类的新实例(例如
Bitmap* myBitmap = newBitmap(1010);
,并使用其内部方法对其进行操作(例如myBitmap->getFirstBitSet()
)
现在,以下哪种方法最快?就性能而言,直接的简单函数和类封装的static
函数之间真的有什么区别吗?还有其他我没有提到的更可取的场景吗?
旁注:我使用的是适用于Mac OS X 10.6.8的clang++
编译器。(如果这有什么不同的话)
在CPU级别,只有一种函数,它在很大程度上是C类的集合。你可以自己制作,但是。。。
事实证明,考虑到效率而构建的C++将大多数函数直接映射到调用指令:
- 命名空间级别的函数类似于常规的C函数
- 静态方法类似于名称空间级别的函数(从调用的角度来看)
- 非静态方法与静态方法非常相似,只是在其他参数(一个指针)之上传递了一个隐式
this
参数
所有这三个都有完全相同的性能。
另一方面,virtual
方法有轻微的开销。有一份关于性能的C++技术报告估计,与非虚拟方法相比,空函数的开销在10%到15%之间(来自内存)。这意味着,对于任何有肉的功能(即做真正的工作),开销本身几乎会迷失在噪音中。真正的代价来自对内联的抑制,除非virtual
调用可以在编译时推导出来。
经典的旧C函数和类的静态方法之间绝对没有区别。区别仅在于审美。如果你有多个C函数,它们之间有一定的关系,你可以:
- 将它们分组为一个类
- 将它们放入名称空间
差异将再次体现在美学上。这很可能会提高可读性。
如果这些C函数共享一些静态数据,那么(如果可能的话)将这些数据定义为类的私有静态数据成员是有意义的。在这种情况下,带有类的变体比带有命名空间的变体更可取。
我建议您不要创建虚拟实例。这将误导源代码的读者。
为每个位图创建一个实例是可能的,甚至可能是有利的。尤其是在典型场景中多次调用此实例上的方法。
相关文章:
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 性能比较:f(std::string&&) vs f(T&&)
- 性能:否则如果 vs if 在已经返回的函数中
- Dijkstra 最短路径算法性能 std::p riority_queue VS std::set.
- constexpr vs重复函数调用性能
- C++性能:模板vs boost.any
- 类方法VS类静态函数VS简单函数-性能方面
- 当使用不相等vs均等时,是否存在任何性能差异
- 如何避免 VS 中unique_ptr签入的性能警告
- C++ std::vector<> vs new[] 性能
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 赛通VS C++性能比较
- 性能标准::strstr vs. 标准::字符串::查找
- if/else vs虚拟功能:设计性能
- google::dense_hash_map vs boost::unordereded_map性能问题
- Nodejs vs C++ 简单数学的性能
- 数字生成器性能linux vs windows
- 性能问题:Java vs c++
- c++中嵌套三个映射Vs单独映射的性能
- 基本数据类型的相等操作符Vs memcmp的性能