类方法VS类静态函数VS简单函数-性能方面

Class methods VS Class static functions VS Simple functions - Performance-wise?

本文关键字:VS 性能 方面 函数 简单 静态函数 类方法      更新时间:2023-10-16

好的,这是我想要的:

  • 我写了几个要求很高的函数(主要是在位图等上操作),这些函数必须尽可能快
  • 现在,让我们还提到,这些函数也可以按类型分组,甚至可以按它们操作的变量类型分组
  • 问题是,除了算法的实现之外,我还应该做什么——从技术角度来看——以免弄乱速度

现在,我正在考虑以下场景

  • 将它们创建为简单的函数,并将必要的参数作为参数传递
  • 创建一个类(用于"分组"/组织目的)并将其声明为静态
  • 按类型创建类,例如创建一个用于处理位图的类,为每个位图创建该类的新实例(例如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函数共享一些静态数据,那么(如果可能的话)将这些数据定义为类的私有静态数据成员是有意义的。在这种情况下,带有类的变体比带有命名空间的变体更可取。

我建议您不要创建虚拟实例。这将误导源代码的读者。

为每个位图创建一个实例是可能的,甚至可能是有利的。尤其是在典型场景中多次调用此实例上的方法。